3

アップルの医師Modifying the Fetch Requestから、NSFetchedResultsControllerNSFetchRequestを変更することができます。手順は簡単に設定できます。NSFetchedResultsControllerのフェッチリクエストを変更してテーブルのデータをリロードするためのレシピ

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

ほとんどの場合、そのメソッドを呼び出すと動作するはずです。しかし、正しい方法がありますか?

はちょうどあなたが完了したら、あなた スワップコントローラ、その後endUpdates前beginUpdatesテーブルビュー自身を送信してください:How to switch UITableView's NSFetchedResultsController (or its predicate) programmatically?

TechZenは、と書きました。この は、 FRCがスワップアウトされているときにテーブルが狭いウィンドウでデータを要求するのを防ぎます。その後、reloadDataを呼び出します。

正確にはどういう意味ですか?

答えて

8

正しいフェッチ(何らかの種類の条件文)を生成するロジックが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の作成をカスタマイズするための値を保持するNSDictionaryのentityDescriptionを持っています。 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]; 
} 
+0

ご回答いただきありがとうございます。あなたは何を意味するのかをより良く説明できますか?乾杯。 –

+0

私の答えを広げた – agilityvision

関連する問題