iphone - 为什么在 iPad 上删除后需要 CoreData forceFetch 而在 iPhone 上则不需要?

标签 iphone ipad core-data

当以下代码在 iPhone (ios 3.1) 上运行时,删除后获取的对象数比删除前少 1。但在 iPad (ios 3.2) 上,计数保持不变。这种不一致导致了 iPad 上的崩溃,因为代码中的其他地方在删除后不久就会调用 fetchedObjects,并且调用代码会信任计数,尝试访问刚刚删除的对象的属性,从而导致 NSObjectInaccessibleException 错误(见下文) )。解决方法是使用对performFetch 的注释掉调用,该调用在执行时会使对fetchObjects 的第二次调用产生与没有它的iPhone 上相同的结果。我的问题是:为什么 iPad 产生的结果与 iPhone 不同?这是我最近发现并发布的第二个差异。

-(NSError*)deleteObject:(NSManagedObject*)mo;
{
NSLog(@"\n\nNum objects in store before delete: %i\n\n",
      [[self.fetchedResultsController fetchedObjects] count]);

    [self.managedObjectContext deleteObject:mo];

    // Save the context.
    NSError *error = nil;
    if (![self.managedObjectContext save:&error]) {
    }

//  [self.fetchedResultsController performFetch:&error];  // force a fetch

NSLog(@"\n\nNum objects in store after delete (and save): %i\n\n", 
      [[self.fetchedResultsController fetchedObjects] count]);

    return error;
}

(完整的 NSObjectInaccessibleException 是:“由于未捕获的异常“NSObjectInaccessibleException”而终止应用程序,原因:“CoreData 无法满足“0x1dcf90”的错误

最佳答案

将以下代码添加到您的 FRC 委托(delegate)即可解决此问题。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { }

感谢 Apple Dev 论坛上的 BenT 提供的答案(请参阅上面我的评论)。我向他询问修复的原因,他说:“iPad 使用 iPhoneOS 3.2,而 iPhone 3.1。3.2 中对 NSFetchedResultsController 进行了许多改进,但不幸的是,这对代表们的实际要求产生了副作用。实现一种(任何一种)委托(delegate)方法来获取主动变更跟踪。” https://devforums.apple.com/message/221471#221471 (希望这对某人有帮助。常见问题解答说在这种情况下回答你自己的问题是可以的)

关于iphone - 为什么在 iPad 上删除后需要 CoreData forceFetch 而在 iPhone 上则不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2859301/

相关文章:

iPhone 原型(prototype)设计工具

iphone - 在sqlite中使用行id比较两个表

iPad 3 视网膜显示屏测试?没有 iPad 3

ios - NSFetchedResultsController 始终不返回任何行

iphone - 在 iPhone 应用程序中验证信用卡公式

带有侧边菜单的 iOS 导航

ipad - 如何使用 UIImage(contentsOfFile :String) with image data downloaded from the internet?

ios - 自定义字体显示在 iOS 模拟器上,但不显示在 Storyboard 上

ios - 如何更新核心数据?

objective-c - 您如何创建一组实体,这些实体都与具有特定属性的其他实体有关系?在核心数据中