0

UITableViewCellドキュメントディレクトリにファイルが存在するかどうかに基づいてを変更したい。isAvailableこれは通知ベースであり、objectsプロパティが変更されたときに通知を送信する必要があるように感じます。

誤ってスレッドの問題を引き起こしたくありません。メインスレッドでコアデータオブジェクトを操作しているので、Concreteクラスにカスタムセッターを設定して通知を投稿しても大丈夫ですか?

これを行うための最良の方法は何でしょうか?独自の通知を作成する必要がありますか、それともコアデータがすでに投稿しているものにフックする必要がありますか?

4

1 に答える 1

1

を使用すると、これは非常に簡単ですNSFetchedResultsController。このクラスをと組み合わせて使用​​すると、UITableViewメモリオーバーヘッドを削減し、応答時間を改善できます。

ドキュメントは、NSFetchedResultsControllerクラスリファレンスおよびNSFetchedResultsControllerDelegateプロトコルリファレンスにあります。

さらに、のデリゲートメソッドを実装できますNSFetchedResultsController。デリゲートメソッドを実装NSFetchedResultsControllerすると、データ(登録したデータ)、つまりテーブルでの追加、削除、移動、更新などの操作をリッスンできますNSManagedObjectContext

このテーマに関する非常に優れたチュートリアルは、core-data-tutorial-how-to-use-nsfetchedresultscontrollerです。UITableViewここでは、、、NSFetchedResultsControllerおよびそのデリゲートを設定するためのすべての要素を見つけることができます。

つまり、あなたの質問については、この手法を使用して、(特定の)プロパティが変更されたUITableViewCellときのコンテンツを変更できます。特に、特定の変更に対応するには、次のデリゲートメソッドを実装する必要があります(コメントを参照)。isAvailableNSManagedObject

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

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

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

        case NSFetchedResultsChangeUpdate: // <---- here you will change the content of the cell based on isAvailable property
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
           [tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
           [tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
           break;
    }
}

それが役に立てば幸い。

于 2013-02-25T22:03:33.257 に答える