NSFetchedResultsController によって管理されるテーブル ビューがあります。ただし、検索または作成操作に問題があります。ユーザーがテーブル ビューの一番下に到達すると、別のコンテンツのバッチをサーバーに照会しています。ローカル キャッシュに存在しない場合は、作成して保存します。ただし、存在する場合は、そのデータを取得した結果コントローラーに追加して表示したいと考えています。その部分がよくわかりません。
これまでのところ、私がやっていることは次のとおりです。
- データベースからの最新の 100 件の結果に対するクエリを初期化したときの NSFetchedRequestController ( を使用
setFetchLimit:
)。1000 行あっても、最初は 100 行だけアクセスできるようにしたいです。 - サーバーから返された値の配列を NSOperation に渡して処理します。
- 操作では、操作する新しい管理対象オブジェクト コンテキストを作成します。
- この操作では、配列を繰り返し処理し、フェッチ リクエストを実行して、オブジェクトが存在するかどうかを (サーバー ID に基づいて) 確認します。
- オブジェクトが存在しない場合は、オブジェクトを作成し、操作の管理対象オブジェクト コンテキストに挿入します。
- 反復が完了したら、マネージド オブジェクト コンテキストを保存します。これにより、メイン スレッドでマージ通知がトリガーされます。
マージ中に、手順 4 で新しく作成されたオブジェクトがテーブルに挿入されますが、既に存在し、フェッチされたばかりのオブジェクトは挿入されません。これが私の NSOperation からの関連コードです
for (NSDictionary *resultsDict in self.results)
{
NSNumber *dbID = [NSNumber numberWithLong:[[resultsDict valueForKey:@"id"] longValue]];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:kResultEntityName inManagedObjectContext:moc]];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat: @"(dbID == %@)", dbID]];
NSError *error = nil;
NSManagedObject *newObject = nil;
// Query the data store to see if the object exists
newObject = [[moc executeFetchRequest:fetchRequest error:&error] lastObject];
[fetchRequest release];
// If it doesn't exist, create it.
if ((tweet == nil))
{
// Create the NSManagedObject and insert it into the MOC.
}
}
メインスレッドに渡したいのは、新しく作成されたオブジェクトと、ループが繰り返されるたびにフェッチ要求でフェッチされた可能性のある既存のオブジェクトです。
それは私が見逃している単純なものであり、正しい方向に微調整を使用できるように感じます.