Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在iPad上删除后需要CoreData forceFetch,而在iPhone上则不需要?_Iphone_Ipad_Core Data - Fatal编程技术网

为什么在iPad上删除后需要CoreData forceFetch,而在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

在iPhone(ios 3.1)上运行以下代码时,删除后获取的对象数比删除前少一个。但在iPad(ios 3.2)上,这一数字保持不变。这种不一致性导致了iPad上的崩溃,因为在代码中的其他地方,删除后不久,会调用FetchedObject,调用代码会信任计数,尝试访问刚刚删除的对象的属性,导致NSObjectInAccessibleeException错误(见下文)。修复方法是使用对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代表将解决此问题

- (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中帮助了我,