0
  • 編集 * したがって、これを間違った目的で使用しているようで、最初のフェッチ時にデリゲートが呼び出されることはありません。データの実際のフェッチは高速ですが、後処理は高速ではないため、これを使用してフェッチをバッチ処理したかったのです。代わりにバックグラウンド プロセスにオフロードする必要があるだけです * 編集 *

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 が機能しない理由について何か考えはありますか?

4

1 に答える 1

0

十分な情報がありません。まあ、正しい情報ではありません。あなたが投稿していないので、私は推測しなければなりません...

まず、取得リクエストはどのようなものですか? 取得するオブジェクトを適切に指定していますか? ソート記述子 (FRC フェッチ要求の要件) はありますか?

通常、View Controller がロードされたときにリクエストを開始します...コード ショーのようにデータを手動で挿入する呼び出しは、まあ、型にはまらないと言っておきましょう。

于 2012-05-12T02:02:26.380 に答える