0

tabbarcontroller の 2 番目のタブに次のコードを設定しました。初めてタブを開いたとき、期待どおりにデータが適切に取得されます。ただし、タブを離れてarray戻ってくると、フェッチ リクエストによって返される には 2 倍のエントリが含まれます。返される各オブジェクトは複製されます。タブを離れて再び戻ると、エントリが再び複製され、それぞれ 3 つになります。これを実現するリクエストの何が間違っていますか?

- (void)viewWillAppear:(BOOL)animated {
    AppDelegate *delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:delegate.managedObjectContext];
    [fetchRequest setEntity:entity];

    // sort the results, since we want the most recent entry first
    NSSortDescriptor *dateSort = [[NSSortDescriptor alloc] initWithKey:@"key" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:dateSort];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSError *error;
    NSMutableArray *array = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
    NSLog(@"error %@",[error localizedDescription]);
    self.fetchedObjects = [array copy];
    [array removeAllObjects];

    [self.tableView reloadData];
}

更新: NSFetchedResultsController に切り替えたところ、問題が修正されました。

4

3 に答える 3

0

それが発生する理由をすぐに示すものはありませんが、実際のフェッチ自体を取り巻く疑わしいコーディングは、デリゲートメソッドまたはコントローラーの他の部分にエラーがある可能性があることを示しています。

フェッチされた結果コントローラーも使用していますか?後でfetchObjectsコレクションを変更しますか?

データベースには実際にこれらの余分なオブジェクトがすべて含まれていますか、それともこのコントローラーの配列だけですか?

また、viewWillAppearでこのすべての作業を行うことは、おそらく良い選択ではないことに注意してください。

于 2012-08-06T00:12:45.033 に答える
0

NSFetchedResultsController に切り替えて、問題を解決しました。

于 2012-08-09T16:57:08.357 に答える
0

コードを次のように変更しようとするとどうなりますかself.fetchedObjects = [[delegate.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];

UITableViewDataSource実装された&を含むコードをもっと見せていただけますUITableViewDelegate methodsか?

于 2012-08-07T05:39:51.470 に答える