2016-03-02 160 views
0

我使用Parse在基於Swift的iOS應用程序中開發一個簡單的聊天系統。到目前爲止,我有兩個在Parse中定義的類:User(定義一個用戶)和Message(定義發送給用戶的單個消息)。這是我的消息類字段:通過「OtherUser」解析核心數據庫獲取最新記錄

UserFromID (pointer): points to the User object that sent the message 
UserToID (pointer): points to the User object that receives the message 
createdAt (DateTime): creation point in time (built-in field) 
Content (string): the textual message to show the user 

在對話選擇畫面,我想顯示一個表格,列出了登錄的用戶與互動的每一位用戶。我還想抓取該對話中記錄的最後一條消息,而不管在該對話中兩個用戶之間是誰發送的。我已經能夠做到這一點,但在浪費的方式:

// get all messages sent FROM and TO the user 
let primaryObj = PFObject(withoutDataWithClassName: "_User", objectId: self.userID) 
let fromQuery = PFQuery(className: "Message") 
let toQuery = PFQuery(className: "Message") 

// add constraints to both queries 
fromQuery.whereKey("UserFromID", equalTo: primaryObj) 
toQuery.whereKey("UserToID", equalTo: primaryObj) 

// generate the concatenated query, include User access, and return sorted 
let masterQuery = PFQuery.orQueryWithSubqueries([fromQuery, toQuery]) 
masterQuery.includeKey("UserFromID") 
masterQuery.includeKey("UserToID") 
masterQuery.orderByDescending("createdAt") 

// execute the query, and perform response logic 
masterQuery.findObjectsInBackgroundWithBlock({ 
    (results: [PFObject]?, error: NSError?) -> Void in 
    // query logic goes here... 
}) 

這工作,但同樣,它返回發送和接收的所有用戶的登錄用戶的所有郵件。我只想要每個用戶之間最近的消息。目前的解決方案會產生很多開銷,我認爲Parse對象請求的硬限制是1000.兩個用戶在一個月內甚至一個星期內發送1000條消息非常容易,具體取決於用戶。我的解決方案將需要每個設備的許多大型查詢,忽略緩存措施,而我的請求將僅僅通過聊天來完成。特別是當數據要求太低時。

我希望我的fromQuery和toQuery能夠在每個唯一的其他用戶基礎上獲取帶有最大createdAt字段(DateTime)的消息。

回答

0

我認爲你應該做的是把限制到fromQuery和toQuery這樣的:

fromQuery.limit = 1 
toQuery.limit = 1 

這樣,你總是會得到只有2的結果。然後,當您得到結果時,只需比較2個結果的createdAt屬性。