0

我已将 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该方法(我的断点在其中)。

有谁知道出了什么问题?

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

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

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

4

1 回答 1

1

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

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

顺便说一句很棒的图表:)

您能否在以下位置显示代码:

  1. 创建你的上下文
  2. 在主线程上执行块以插入数据
于 2012-05-27T15:35:03.360 回答