代码之家  ›  专栏  ›  技术社区  ›  Alyoshak

为什么删除ipad后需要coredata forcefetch,而不是iphone?

  •  7
  • Alyoshak  · 技术社区  · 14 年前

    在iPhone(iOS 3.1)上运行以下代码时,获取对象的计数 之后 删除比删除前少一个。但在ipad(iOS 3.2)上,这个数字还是一样的。这种不一致性导致了iPad上的崩溃,因为代码中的其他地方,在删除后不久,将调用FetchedObjects,调用代码信任计数,尝试访问刚刚删除的对象的属性,从而导致nsObjectionAccessibleException错误(请参见下文)。修复方法是使用对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;
    }
    

    (完整的nsObjectionAccessibleException为:“由于未捕获的异常而终止应用程序”“nsObjectionAccessibleException”,原因:“coreData无法完成'0x1DCF90的错误。”

    3 回复  |  直到 12 年前
        1
  •  6
  •   Alyoshak    14 年前

    将以下代码添加到FRC代理将解决此问题。

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

    感谢Bent在AppleDev论坛上的回答(请参阅我上面的评论)。我问他如何解释这个问题,他说:“iPad使用的是iPhone3.2,而iPhone3.1。3.2中对nsfectedResultsController进行了许多改进,但不幸的是,这对委托人实际实施一种(任何一种)委托方法以获得主动变更跟踪的要求产生了副作用。” https://devforums.apple.com/message/221471#221471 (希望这能帮助别人。常见问题解答说,在这种情况下回答自己的问题是可以的)

        2
  •  0
  •   Adriaan Tijsseling    14 年前

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

        3
  •  0
  •   hinderberg    14 年前

    添加委托方法无法解决我的问题。但我通过在删除完成后添加强制的performfetch解决了这个问题。在执行提取之前,我还删除了缓存。

    我在iOS 4.1上。