0

内部の最初の呼び出しviewWillAppearは機能しません。ブロックコールバックの2番目の呼び出しは機能します。何も害はありませんが、なぜだろうか?

私の理解では、performFetch後でNSFRCに変更が加えられない限り、呼び出しは1回限りのことである必要があります。の読み込みが遅延frcしているため、変更される可能性はありません。performFetchおよびを呼び出した後reloadData、NSFRCはコンテキストの監視を開始します。また、コンテキストの変更はすべてテーブルビューに自動的に入力されます。

しかし、私のコードではreloadData、2番目の後に削除performFetchしても、テーブルビューには何も起こりません。performFetchそれに基づいて、最初のものは完全には効果がないと思います。

明らかな何かが欠けていますか?

-(NSFetchedResultsController *)frc
{
    if (!_frc) {
        [_frc setDelegate:self];
        NSFetchRequest *freq = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
        NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
        [freq setSortDescriptors:@[sd]];

        _frc = [[NSFetchedResultsController alloc] initWithFetchRequest:freq managedObjectContext:[[BNRStore sharedStore]context] sectionNameKeyPath:nil cacheName:nil];
    }
    return _frc;
}


-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // first time
    NSError *storeError = nil;
    if (![self.frc performFetch:&storeError]) {
        NSLog(@"%@",[storeError localizedDescription]);}
    [self.tableView reloadData];

    if ( [[self.frc fetchedObjects] count] == 0) {
        [[BNRStore sharedStore] fetch:^(NSError *error){
            if (error) {
                UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [av show];
            } else {

                // second time
                NSError *storeError = nil;
                if (![self.frc performFetch:&storeError]) {
                    NSLog(@"%@",[storeError localizedDescription]);}
                [self.tableView reloadData];
            }
        }];
    }    
}
4

1 に答える 1

2

初期化する前に、自分をNSFetchedResultsControllerの代理人として設定しています。にメッセージを送信できるのでnil(その時点ではまだです)、エラーは発生しません。ただし、デリゲートが他の場所に設定されることはないため、テーブルビューも更新されません。初期化後に呼び出しをsetDelegateに移動すると、機能するはずです。

-(NSFetchedResultsController *)frc
{
    if (!_frc) {
        NSFetchRequest *freq = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
        NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
        [freq setSortDescriptors:@[sd]];

        _frc = [[NSFetchedResultsController alloc] initWithFetchRequest:freq managedObjectContext:[[BNRStore sharedStore]context] sectionNameKeyPath:nil cacheName:nil];
        [_frc setDelegate:self];
    }
    return _frc;
}
于 2013-01-10T19:38:55.447 に答える