2016-08-02 103 views
0

我想弄清楚使用適用於iOS的分析SDK分頁結果的正確方法。我遇到的問題是,我試圖分頁的內容有可能經常更改。分頁與動態內容

例如:

有一束存儲在服務器上對象的應用程序,並獲得這些對象的排序與最新的第一和分頁的情況下,也有很多的對象的要求。當用戶滾動時,當他們正在接近當前頁面上的最後一個對象時,請求下一頁。

假設用戶滾動到頁面二,然後一個新的對象被添加到對象列表中,然後用戶滾動另一頁面。當請求下一頁時,它們將在第二頁上得到最後一條消息的副本,並且由於頁0已經被加載,所以新對象將不會被顯示。

如何處理這樣的事情?

如果對象最早排序時實現方式會發生什麼變化?

在此先感謝您的幫助。

編輯:請求僞代碼

- (void)fetchObjectsForPage:(NSUInteger)page completion:(void (^)(NSArray *_Nullable objects, PageInfo *_Nullable pageInfo, NSError *_Nullable error))completion{ 
    PFQuery *query = [SomeObject query]; 
    [query orderByAscending:@"updatedAt"]; 
    [query setLimit:50]; 
    [query setSkip:50 * page]; 
    [query findObjectsInBackgroundWithBlock:^{NSArray *_Nullable objects, NSError *_Nullable error){ 
     ... 
     >>> Do error checking and return array along with paging info (total number of objects, page size) or error in completion block. 
    }]; 
} 

這不是我在使用,它是搞清楚如何正確處理分頁表中,當一個新的對象被添加麻煩的請求。

+0

你可以請粘貼處理請求的查詢嗎? –

+0

該代碼適用於我不允許共享的客戶端項目。儘管我會提出一些僞代碼。 – RPK

回答

0

你可以做的是:通過updatedAt

  1. 創建一個查詢將返回50行(像你這樣)爲了
  2. 當你得到的結果從列表中採取的最後一個項目,保存在某些全局屬性中更新的項目
  3. 在下一次調用中,請不要使用setOffset,而是獲取接下來的50行並添加其中updatedAt大於全局對象的updatedAt的另一個條件。這樣,你要確保你不會在你的列表

重複記錄在結束你的代碼看起來應該像下面這樣:

PFQuery *query = [PFQuery queryWithClassName:@"SomeClassName"]; 
[query orderByAscending:@"updatedAt"]; 
[query setLimit:50]; 

if (self.lastItemUpdatedAt){ 
    [query whereKey:@"updatedAt" greaterThan:self.lastItemUpdatedAt]; 
} 

[query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) { 

    if (objects.count > 0){ 
     self.lastItemUpdatedAt = [[objects lastObject] updatedAt]; 
    } 

}]; 

現在,如果你使用updatedAt有一個機會,你仍然會得到重複的,因爲我們假設某人改變對象,因此updatedAt也將被改變(所以它會比您保存的updatedAt更大)在這種情況下,你可以使用createdAt,而不是updatedAt因爲createdAt將永遠不會被改變

+0

謝謝。這絕對有幫助。在你已經獲取頁面0之後,你將如何處理一個新的對象? (由於新項目位於頁面0的索引0處) – RPK

+0

您按升序對項目進行排序,因此新對象將位於底部 –

+0

謝謝。這似乎是一個可以接受的答案。 – RPK