为什么在iPad上删除后需要CoreData forceFetch,而在iPhone上则不需要?
在iPhone(ios 3.1)上运行以下代码时,删除后获取的对象数比删除前少一个。但在iPad(ios 3.2)上,这一数字保持不变。这种不一致性导致了iPad上的崩溃,因为在代码中的其他地方,删除后不久,会调用FetchedObject,调用代码会信任计数,尝试访问刚刚删除的对象的属性,导致NSObjectInAccessibleeException错误(见下文)。修复方法是使用对performFetch的注释掉调用,当执行该调用时,对fetchObjects的第二次调用将产生与iPhone上没有它时相同的结果。我的问题是:为什么iPad产生的结果与iPhone不同?这是我最近发现并发布的第二个差异为什么在iPad上删除后需要CoreData forceFetch,而在iPhone上则不需要?,iphone,ipad,core-data,Iphone,Ipad,Core Data,在iPhone(ios 3.1)上运行以下代码时,删除后获取的对象数比删除前少一个。但在iPad(ios 3.2)上,这一数字保持不变。这种不一致性导致了iPad上的崩溃,因为在代码中的其他地方,删除后不久,会调用FetchedObject,调用代码会信任计数,尝试访问刚刚删除的对象的属性,导致NSObjectInAccessibleeException错误(见下文)。修复方法是使用对performFetch的注释掉调用,当执行该调用时,对fetchObjects的第二次调用将产生与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代表将解决此问题
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { }
感谢BenT在Apple Dev论坛上给出的答案(见上面我的评论)。我问他关于修复的解释,他说,“iPad使用的是iPhoneOS 3.2,而iPhones 3.1。3.2中的NSFetchedResultsController有许多改进,但不幸的是,这对学员的要求产生了副作用,即实际实施一种(任何一种)学员方法以获得主动更改跟踪。”(希望这对某人有所帮助。常见问题解答说在这种情况下回答您自己的问题是可以的)请记住,fetchedresultscontroller缓存数据以加快其工作速度。删除对象后,您也可以调用+(void)deleteCacheWithName:确保删除的对象不会在缓存中逗留。也就是说,如果您没有使用委托调用。添加委托方法并不能解决我的问题。但我通过在删除完成后添加强制performFetch来解决此问题。我还在执行提取之前删除缓存
我使用的是iOS 4.1。更新:苹果开发论坛上有人给了我一个有趣的回复。各位专家可能会感兴趣。如果我能准确地理解他的建议,我将尝试这个方法。“尝试向FRC代表添加一个空的-controllerDidChangeContent:方法。-Ben“Ben的建议解决了这个问题。我只是在我的FRC委托中添加了一个空controllerdChangeContent:method。当然,现在我必须找出原因。我向Ben询问了更多信息,如果他说出了,你会在这里看到。希望这个问题和答案对其他人有用。只需在FRC委托中添加以下行:-(void)controllerDidChangeContent:(NSFetchedResultsController*)controller{}来自苹果开发论坛的完整解释:“iPad使用的是iPhoneOS 3.2,而iPhones 3.1。在3.2中,NSFetchedResultsController有许多改进,但不幸的是,对学员实际实现一个(任何一个)的要求产生了副作用“这让我简直疯了。同样的问题和修复也适用于iOS 4.0(iPhone OS 4.0)。我真希望我在6小时前找到这篇帖子。谢谢你的回答。我对这个问题也很生气。它在iOS 4.3中帮助了我,