- 編集 * したがって、これを間違った目的で使用しているようで、最初のフェッチ時にデリゲートが呼び出されることはありません。データの実際のフェッチは高速ですが、後処理は高速ではないため、これを使用してフェッチをバッチ処理したかったのです。代わりにバックグラウンド プロセスにオフロードする必要があるだけです * 編集 *
UIViewController の ViewDidLoad メソッドで NSFetchedResultsController を作成し、デリゲートを self に設定します。
self.resultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:self.fetchRequest managedObjectContext:[AppDelegate singleton].managedObjectContext sectionNameKeyPath:nil cacheName:nil] autorelease];
self.resultsController.delegate = self;
次に、ViewController がタップされると、必要に応じてフェッチを実行します。
int indexPathCount = self.indexPaths.count;
int objectCount = self.resultsController.fetchedObjects.count;
if (indexPathCount && objectCount)
{
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:self.indexPaths withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
}
else
{
NSError* error;
BOOL success = [self.resultsController performFetch:&error];
if (!success)
{
UIAlertView* alert = [[[UIAlertView alloc] initWithTitle:@"ERROR" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
[alert show];
}
}
上記のコードはオブジェクトをフェッチせず、デリゲート メソッドは呼び出されません。UIViewController をデリゲートとして割り当てる上記のコード行をコメント アウトすると、タップされたコードの 2 回目の実行中に、objectCount に正しい値が含まれます。
- EDIT * 上記のコードは、実際にオブジェクトをフェッチします。コードの 2 回目の実行では、objectCount は期待どおりになりましたが、デリゲート メソッドはまだ呼び出されていません。今のところ、メモリ管理で何か悪いことをしていると思いますが、保持カウントはすべて正しいようです。* 編集*
デリゲート メソッドの実装を次に示しますが、それらの正確性を何十回も確認しました。
- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller
{
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath*)newIndexPath
{
switch(type)
{
case NSFetchedResultsChangeInsert:
{
NSIndexPath* tableIndexPath = [NSIndexPath indexPathForRow:newIndexPath.row inSection:self.section];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:tableIndexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.indexPaths addObject:tableIndexPath];
} break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller
{
[self.tableView endUpdates];
}
デリゲートが提供されたときに NSFetchedResultsController が機能しない理由について何か考えはありますか?