NSFetchedResultsController的didChangeObject未被调用

时间:2012-05-26 19:54:20

标签: iphone objective-c ios nsfetchedresultscontroller

我已将NSFetchtedResultsController指定为属性...

@property (nonatomic, strong) NSFetchedResultsController *controller;

...并将委托设置为我的班级。

self.controller.delegate = self;

然后我在标题中提到了方法并在其中加了一个断点。

    - (void)controller:(NSFetchedResultsController *)controller 
                didChangeObject:(id)anObject 
                atIndexPath:(NSIndexPath *)indexPath 
                forChangeType:(NSFetchedResultsChangeType)type 
                newIndexPath:(NSIndexPath *)newIndexPath 
    {    

    => BREAKPOINT <=

    }

我已经为控制器创建了获取请求,如下所示:

  NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Post"]; 
   // ... some sort ...
    self.controller = [[NSFetchedResultsController alloc]
                       initWithFetchRequest:fetchRequest
                       managedObjectContext:self.context
                       sectionNameKeyPath:nil
                       cacheName:@"cache"];

现在我在同一个上下文中的另一个类中存储了一些类型为“Post”的NSManagedObjects,但didChangeObject方法从不被称为(我的断点在其中)。< / p>

有谁知道出了什么问题?

更新#1:从服务器获取某些帖子并将其存储到上下文中的类是使用GCD异步执行的。

更新#2:我以另一种方式尝试过它,因为它无法在多线程环境中使用上下文。 (感谢斯韦纳) 现在ServerConnection在异步块中运行(使用GCD)并在主线程上执行选择器。这个选择器方法将帖子存储在数据库中,并且应该更新tableview。基本上,我认为当我在这个上下文中存储某些东西时,应该自动调用didChangeObject方法?但事实并非如此。 : - /

我添加了一个简短的序列图来说明我的当前状态。 sample sequence diagram 有谁知道为什么这不起作用?请耐心等待。我是CoreData和Objective-C的新手。 :)

1 个答案:

答案 0 :(得分:1)

  

更新#1:从服务器获取一些帖子并将其存储到上下文中的类是使用GCD异步执行的。

如果是这种情况,您如何为GCD块创建托管对象上下文? 上下文或托管对象都不是线程安全的,不能在线程之间传递。此外,对一个线程上下文所做的更改不会自动传播到其他线程上的上下文。在iOS5之前,这意味着通过使用您的NSFetchedResultsController实例的mergeChangesFromContextDidSaveNotification:方法来监听NSManagedObjectContextDidSaveNotification并将其合并到那里。

顺便说一句好图:)

请你在以下几点展示代码:

  1. 创建您的上下文
  2. 在要插入的主线程上执行块 数据