4

アップルのドキュメントからフェッチリクエストNSFetchRequestを変更すると、のを変更できることがわかりますNSFetchedResultsController。手順は簡単に設定できます。

呼び出した後、テーブルビューperformFetch:を呼び出す必要があると思います。reloadDataそのような呼び出しを実行する方法は?

いくつかのstackoverflowトピックを読んで、そのメソッドを呼び出すことはほとんどの場合うまくいくはずだとわかりました。しかし、それを行う正しい方法はありますか?

UITableViewのNSFetchedResultsController(またはその述語)をプログラムで切り替える方法はTechZenは次のように書いています。

コントローラを交換する前にテーブルビュー自体にbeginUpdatesを送信し、完了したらendUpdatesを送信してください。これにより、FRCがスワップアウトされているときに、テーブルが狭いウィンドウでデータを要求するのを防ぎます。次に、reloadDataを呼び出します。

それが何を意味するのか正確に説明していただけますか?

4

1 に答える 1

9

正しいフェッチ(ある種の条件ステートメント)を生成するロジックがNSFetchedResultsControllerインスタンスのゲッターにあると仮定します。それなら本当に簡単です

self.fetchedResultsController = nil; // this destroys the old one
[self.tableview reloadData]; 
// when the table view is reloaded the fetchedResultsController will be lazily recreated

編集:私が行ったことの完全なコードサンプルを追加します。基本的に、NSFetchedResultsControllerの作成をカスタマイズするための値を保持するNSDictionaryentityDescriptionがあります。fetchRequestを変更したい場合は、entityDescription変数を変更して新しい値を示し、セッターをオーバーライドしてfetchedResultsControllerをリセットし、テーブルをリロードします。それはあなたに基本的な考えを与えます。

- (NSFetchedResultsController *)fetchedResultsController 
{
    if (__fetchedResultsController != nil) {
        return __fetchedResultsController;
    }
    if (self.entityDescription == nil) {
        return nil;
    }
    // Set up the fetched results controller.
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[self.entityDescription objectForKey:kEntityName]];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    if ([[self.entityDescription objectForKey:kEntitySortField] isEqualToString:@"null"] == NO) {
        NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:[self.entityDescription objectForKey:kEntitySortField] ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
        [fetchRequest setSortDescriptors:sortDescriptors];
    }

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                                                                                managedObjectContext:self.moc sectionNameKeyPath:nil cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return __fetchedResultsController;
}

- (void)setEntityDescription:(NSDictionary *)entityDescription
{
    _entityDescription = entityDescription;
    self.fetchedResultsController = nil;
    [self.tableView reloadData];
}
于 2012-04-16T21:55:30.983 に答える