iphone - 奇怪的核心数据错误

标签 iphone ios core-data nsfetchedresultscontroller

我的 iPhone (4.1.2) 应用程序有一个菜单,每个菜单项都指向一个由 NSManagedObject 子类填充的不同表格 View 。我为每个使用相同的 View Controller ,但不同的是提取请求的谓词,因此根据用户选择的菜单项显示不同的数据。很简单。

在我实际保存托管对象上下文之前一切正常。然而,在应用程序进入后台并重新进入前台后,事情变得很奇怪,因为我正在使用这个:

- (void)applicationDidEnterBackground:(UIApplication*)application {
    NSError *error = nil;
    if(managedObjectContext != nil)
        if([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
}

我认为这是保存我的数据的合适时间。但是在这发生之后,在我调用提取结果 Controller 上的 performFetch: 之后,它的 fetchedObjects 是来自 PREVIOUS 提取请求的提取对象,而不是新对象。也就是说,如果我这样做:

// Choose menu item 1

[self.fetchedResultsController performFetch:nil]; // With fetch request 1
NSLog(@"%i objects were fetched", [[self.fetchedResultsController fetchedObjects] count]); // Items for fetch request 1

// Go back to menu, choose menu item 2 for new fetch request

[self.fetchedResultsController performFetch:nil]; // Fetch request 2
NSLog(@"%i objects were fetched", [[self.fetchedResultsController fetchedObjects] count]); // Items for Fetch request 2

// Hit home button, applicationDidEnterBackground: is called
// Relaunch
// Choose menu item 1

[self.fetchedResultsController performFetch:nil]; // With fetch request 1
NSLog(@"%i objects were fetched", [[self.fetchedResultsController fetchedObjects] count]); // Items for fetch request 2 - HUH?

所以问题在于在我的托管对象上下文中调用 save:。如果我从不保存数据,获取请求永远不会像这样混淆,但是一旦我保存了,就好像旧的获取请求被保存了一样,即使 fetchedResultsController 本身只是在我的 View Controller 的 viewDidLoad 方法。

有人知道发生了什么事吗?

更新:更多代码。

- (void)viewDidLoad {
    delegate = (MAAppDelegate *)[[UIApplication sharedApplication] delegate];
    managedObjectContext = delegate.managedObjectContext;

    [self.fetchedResultsController performFetch:nil];
    NSUInteger count = [[self.fetchedResultsController fetchedObjects] count]; // Bug is detected here

    // ...
}

- (NSFetchedResultsController *)fetchedResultsController {
    if(_fetchedResultsController)
        return _fetchedResultsController;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:managedObjectContext];
    NSPredicate *predicate = nil;
    if([self.navigationItem.title isEqualToString:@"Personal"]) 
        predicate = [NSPredicate predicateWithFormat:@"account.username = %@ AND user.username = %@", delegate.currentAccount.username, delegate.currentAccount.username];
    else if([self.navigationItem.title isEqualToString:@"Favorites"])
        predicate = [NSPredicate predicateWithFormat:@"account.username = %@ AND favorited = YES", delegate.currentAccount.username];
    else
        predicate = [NSPredicate predicateWithFormat:@"account.username = %@", delegate.currentAccount.username];
    [fetchRequest setEntity:entity];
    [fetchRequest setFetchBatchSize:20];
    [fetchRequest setPredicate:predicate];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tweetID" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                                                managedObjectContext:managedObjectContext
                                                                                                  sectionNameKeyPath:@"retrieved"
                                                                                                           cacheName:@"Root"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    [sortDescriptor release];
    [sortDescriptors release];

    return _fetchedResultsController;
}

最佳答案

您是否在每个 subview 中缓存,如果是,您是否为每个缓存使用了不同的名称?

关于iphone - 奇怪的核心数据错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423135/

相关文章:

ios - Google IOS 分析 V3 未在仪表板上注册

ios - swift 类 'nil' 中的所有值

ios - 当我点击 Google Maps SDK for iOS 中的另一个标记时,我可以拦截标记取消选择吗?

ios - Easy Mapping 不映射 Core Data 一对多关系对象

iphone - iOS并发/版本分发

jquery - 在运行 iOS 3.0 的 iPhone 3G 上,Phonegap 应用程序中更新 DOM 的调用被忽略

iphone - 从一个字符串中删除另一字符串中存在的字符

ios - AVAudioPlayer 对象声音未播放 - Swift

ios - 内存增加每次核心数据迭代

swift - 如何在编辑 tableView 后更新模型