0

Parse SDK for iOS を使用して結果をページ分割する適切な方法を見つけようとしています。私が抱えている問題は、ページ付けしようとしているコンテンツが頻繁に変更される可能性があることです。

例えば:

サーバーに多数のオブジェクトが保存されているアプリがあり、これらのオブジェクトを取得するためのリクエストは、オブジェクトが多い場合に備えて、最新のものから順に並べ替えられ、ページ分割されます。ユーザーがスクロールすると、現在のページの最後のオブジェクトに近づいているため、次のページが要求されます。

ユーザーが 2 ページ目にスクロールすると、新しいオブジェクトがオブジェクトのリストに追加され、ユーザーは別のページを上にスクロールするとします。次のページが要求されると、2 ページ目の最後のメッセージの複製が取得されます。ページ 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.
    }];
}

それは私が問題を抱えているリクエストではなく、新しいオブジェクトが追加されたときにテーブル内のページングを適切に処理する方法を考え出すことです.

4

1 に答える 1

0

できることは次のとおりです。

  1. (あなたがしたように)50行を返すクエリを作成し、updatedAtで並べ替えます
  2. 結果が得られたら、リストから最後の項目を取得し、項目 updatedAt をいくつかのグローバル プロパティに保存します。
  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];
    }

}];

updateAt を使用すると、重複が発生する可能性があります。これは、誰かがオブジェクトを変更して、updatedAt も変更されると仮定すると (保存した updatedAt よりも大きくなるからです)、この場合はcreatedAtを使用できます。 createdAtは決して変更されないため、updatedAtの代わりに

于 2016-08-02T15:26:52.753 に答える