1

NSFetchedResultsControllerSO内には、デリゲートに関する多くの質問/回答があります。デリゲートが発火することもあれば、発火しないこともあります。また、Core Data は非常に複雑な議論であるため、多くの時間を費やさずに何が起こっているのかを理解することは非常に困難です。さらに、ドキュメントにはいくつかの問題があると書かれていますが、それらはリストされていません。

iOS のさまざまなリリースでの NSFetchedResultsController には、いくつかの既知の問題と動作の変更があります。

したがって、そのようなクラスの動作について明確にする必要があります。特に、ドキュメントから次のように書かれています。

このように、コントローラには実質的に 3 つの操作モードがあり、デリゲートがあるかどうか、およびキャッシュ ファイル名が設定されているかどうかによって決まります。

追跡なし:デリゲートは nil に設定されます。コントローラーは、フェッチが実行されたときのデータへのアクセスを提供するだけです。

メモリのみの追跡:デリゲートは非 nil で、ファイル キャッシュ名は nil に設定されます。コントローラーは、結果セット内のオブジェクトを監視し、関連する変更に応じてセクションと順序付け情報を更新します。

完全永続追跡:デリゲートとファイル キャッシュ名は非 nil です。コントローラーは、結果セット内のオブジェクトを監視し、関連する変更に応じてセクションと順序付け情報を更新します。コントローラーは、その計算結果の永続的なキャッシュを維持します。

私は非常に複雑なアプリを開発しておりNSFetchedResultsController、ストアからデータを取得してテーブルに表示するために利用しています。表示される管理対象オブジェクトにはsyncStatus、外部サービスと同期されているかどうかを確認するためのブール変数があります。syncStatus変数がセルに表示されず、別の情報が表示されます (テキスト値など)。つまり、syncStatus障害として解雇されません。

表ではNSFetchedResultsController、 を使用して、同期されていない要素のみを表示します (bool 値が に設定されていますNO)。

- (NSFetchedResultsController*)fetchedResultsController
{
    if(_fetchedResultsController)
        return _fetchedResultsController;

    NSManagedObjectContext* mainContext = [self managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"LocalEntity" inManagedObjectContext:mainContext]];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"syncStatus == %@", [NSNumber numberWithBool:NO]]];
    [fetchRequest setFetchBatchSize:10];

    // sort descriptor here...

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:mainContext sectionNameKeyPath:nil cacheName:nil];
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;
}

ユーザーは同期したい要素を選択でき、バックグラウンド スレッドが選択した要素をサービスに送信し、それらのsyncStatus変数を に変更しますYES

操作が終了したら、 を設定してNSFecthedResultsControllerDelegate登録するのでNSManagedObjectContextDidSaveNotification(通知を通じて変更をメインスレッドにマージします。通知に正しい変更のオブジェクトが含まれていることがわかります)、テーブルが更新されます (にsyncStatus設定されているオブジェクトYESは表示されません)。

ということで、質問は以下です。

ドキュメントに基づいて、私はメモリのみの追跡オプションを使用しているため、欠落している更新はisSyncStatusメモリにロードされていないという事実によるものですが、それは障害のままですか?

正しい方向に私を提案してもらえますか?

前もって感謝します。

PS

NSFetchedResultsControllerDelegateメソッドが正しく実装されています。メインスレッドでのみ同じことをするとうまくいきます。

4

1 に答える 1

0

NSFetchedResultsControllerDelegateセルを削除するメソッドを実装していますか?

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {

    [self.tableView beginUpdates];    
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {

    UITableView *tableView = self.tableView;

    switch(type) {
        case NSFetchedResultsChangeDelete:

            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];    
            break;
    }    
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {

    [self.tableView endUpdates];    
}
于 2012-11-23T18:40:29.633 に答える