3

コードNSFetchedResultsControllerが次のようにデリゲートを に割り当てる場合:

-(id)initWithFetchedResultsController:(NSFetchedResultsController*)fetchedResultsController
{
    self = [super init];
    if (self != nil)
    {
        fetchedResultsController.delegate = self;
        _fetchedResultController = fetchedResultsController;
    }
    return self;
}

NSFetchedResultsControllerDelegateメソッドが呼び出されること– controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:はありませんself:

-(void)controller:(NSFetchedResultsController *)controller
  didChangeObject:(id)anObject
      atIndexPath:(NSIndexPath *)indexPath
    forChangeType:(NSFetchedResultsChangeType)type
     newIndexPath:(NSIndexPath *)newIndexPath
{
    NSLog(@"Delegate method called"); // Never called
}

述語に問題はなく、述語が割り当てられ、通知の操作が直接機能します。

4

3 に答える 3

11

問題は- (BOOL)performFetch:(NSError **)error、この特定のコードが初期セットではなく結果セットへの変更のみを考慮するため、初期が呼び出されないことです。ただし、コントローラーは、それまでになかったデータの変更に気付かないことになります。次のように init メソッドを変更すると、問題が修正されます。

-(id)initWithFetchedResultsController:(NSFetchedResultsController*)fetchedResultsController
{
    self = [super init];
    if (self != nil)
    {
        fetchedResultsController.delegate = self;
        _fetchedResultController = fetchedResultsController;
        [fetchedResultsController performFetch:nil];
    }
    return self;
}
于 2013-06-17T15:26:19.457 に答える
5

NSFetchedResultsControllerデリゲートを設定して実行performFetchしました。それでもデリゲート メソッドは呼び出されませんでした。

私のフェッチされた結果コントローラーには、ブール値であるsectionNameKeyPathがありました。私は非プリミティブとしてアクセスしていました - としてNSNumber.

挿入および更新していたすべてのエンティティには、このプロパティnilがありました。nil は NO と解釈されると思っていましたが、そうではありませんでした。

このプロパティが nil のエンティティを挿入すると、フェッチされた結果コントローラのデリゲート メソッドがまったく呼び出されませんでした。私の FRC には関係がないように、このレコードは単に無視されます。

したがって、 sectionNameKeyPathとして使用されるプロパティに nil を入れないようにしました。

于 2014-11-05T16:49:52.167 に答える