【问题标题】:Why is a CoreData forceFetch required after a delete on the iPad but not the iPhone?为什么在 iPad 上删除后需要 CoreData forceFetch 而不是 iPhone?
【发布时间】:2011-02-21 00:07:23
【问题描述】:

当以下代码在 iPhone (ios 3.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 的错误

【问题讨论】:

  • 更新:我在 Apple Dev 论坛上收到了一个有趣的回复。各位专家可能有兴趣。如果我能弄清楚他的建议,我会试试这个。 "尝试向您的 FRC 委托添加一个空的 -controllerDidChangeContent: 方法。- Ben"
  • Ben 的建议解决了这个问题。我只是向我的 FRC 委托添加了一个空的 -controllerDidChangeContent: 方法。当然,现在我必须找出原因。我向 Ben 询问了更多信息,如果他咳嗽了,你会在这里看到。希望这个问题和答案对其他人有用。
  • 只需将以下行添加到您的 FRC 委托中:- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { }
  • Apple Dev 论坛的完整解释:“iPad 使用 iPhoneOS 3.2 而 iPhone 3.1。在 3.2 中对 NSFetchedResultsController 进行了许多改进,但不幸的是,对代表的要求产生了副作用实际实现一个(任何一个)委托方法来获得主动变更跟踪。”

标签: iphone ipad core-data


【解决方案1】:

将以下代码添加到您的 FRC 委托将解决此问题。

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

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

【讨论】:

  • 这把我逼疯了。这个完全相同的问题和修复也适用于 iOS 4.0 (iPhone OS 4.0)。我真希望我能在 6 小时前找到这篇文章。
  • 哇,感谢您的回答。我也对这个问题感到生气。它在 iOS 4.3 中帮助了我,
【解决方案2】:

请记住,fetchedresults 控制器会缓存数据以加快其工作速度。删除对象后,您还可以调用 + (void)deleteCacheWithName: 以确保删除的对象不会在缓存中逗留。也就是说,如果您不使用委托调用。

【讨论】:

    【解决方案3】:

    添加委托方法并没有解决我的问题。但是我通过在删除完成后添加强制 performFetch 来解决它。我还在执行提取之前删除了缓存。

    我使用的是 iOS 4.1。

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多