9

NSFetchedResultsControllerを次の方法で開始しました。

NSEntityDescription *myEntity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:myEntity];
[fetchRequest setFetchBatchSize:10];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]];

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];

[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor, nil]];

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

いくつかの事実:

  • wasDeletedは、MyEntityのNSNumberプロパティ(BOOL)です。

  • このプロパティを[NSNumber numberWithBool:YES]NSFetchedResultsControllerDelegateに更新すると、didChangeObjectが呼び出されますが、NSFetchedResultsChangeDeleteの代わりにNSFetchedResultsChangeUpdateが起動されます。

  • ただし、ビューをポップして、フェッチされた結果コントローラーを再度初期化すると、オブジェクトはもう存在せず、機能していることがわかります[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"wasDeleted == %@", [NSNumber numberWithBool:NO]]];

  • このNSFetchedResultsChangeUpdateの後、cellForRowが呼び出されると、wasDeletedが出力され、YESに設定されます。

ここで何が間違っている可能性がありますか?

(つまり、オブジェクトがコンテキストにまだ存在しているが、述語に適合しない場合は、NSFetchedResultsChangeDeleteを呼び出すことができますか?)

4

3 に答える 3

1

もちろんchangeUpdate、そうではありませんchangeDelete。値を更新しただけで、アイテム全体を削除したわけではありません。データベースからアイテムを削除すると、が呼び出されますchangeDelete。また、テーブルがこの属性に基づいてフィルタリングしているため、新しいinitの後には表示されません。

NSFetchedResultsChangeUpdate属性wasDeletedが変更されているかどうかをリッスンして確認する必要があります。その場合は、テーブルビューをニーズに合わせて更新します。特定の行を削除します。

于 2013-02-07T14:26:56.100 に答える
1

私は自分のアプリで同じことを行い、-controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:newIndexPathデリゲートが最初に の変更タイプでNSFetchedResultsChangeDelete呼び出され、続いて の変更タイプで 2 番目の呼び出しが行われることに気付きましたNSFetchedResultsChangeUpdate

これNSFetchedResultsChangeUpdateは予想される動作かもしれませんが、説明されていないのは、最初の呼び出しNSFetchedResultsChangeDeleteが欠落している理由です。このケースを正しく処理していることを確認できますか?

于 2013-02-10T12:48:05.053 に答える
1

私はあなたとまったく同じ問題を抱えていました。

wasDeletedプロパティ名として使用しないでください。deletedCoreData オブジェクトを扱うときは、 のバリエーションを使用しないでください。

プロパティの名前を に変更しhidden、それを述語に使用しました。すべてが期待どおりに機能しました。

于 2013-02-13T07:00:45.407 に答える