0

我有一个使用核心数据的iPhone/iPad应用程序。数据通过各种Web服务调用提供。 我使用轮询机制来确定每个服务调用彼此独立的时间,以便使信息保持最新。因此,很可能有多个后台线程使用多个MOC从这些呼叫处理数据。对于插入和更新,这种方法工作正常。 在试图实现删除功能时,我的程序崩溃。它似乎是由于一个线程中的上下文删除了另一个线程也正在处理的托管对象而导致的,因为删除的对象已发生故障。具有多个背景线程的核心数据

我一直在寻找解决方案,但并没有特别针对任何事情。 删除应该推到主线程的上下文中吗?为了完成所有的处理,在Singleton中维护单个线程和伴随的MOC如何?

任何帮助/指导将不胜感激。

回答

1

我一直在寻找解决方案,但没有得到任何特别的东西。

您是否试过苹果在Core Data Programming Guide中建议的所有内容?没有看到你的代码,在我看来,你缺少的是NSManagedObjectContextDidSaveNotification部分。每个线程必须在其他线程上注册MOC保存。这意味着线程必须都有一个运行循环。

整体而言,这看起来有点乱。我想我会更改体系结构以在主线程上执行所有核心数据更改(而不仅仅是删除)。

+0

在AppDelegate didFinishLaunchingWithOptions方法中: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changesSaved :) name:NSManagedObjectContextDidSaveNotification object:nil];
这就要求:
- (空)changesSaved:(NSNotification *)注意 { [自performSelectorOnMainThread:@selector(changesSavedOnMainThread :) withObject:注意waitUntilDone:YES]; }
最后,
- (空)changesSavedOnMainThread:(NSNotification *)注意 { \t如果([注对象]!= __managedObjectContext)[__managedObjectContext mergeChangesFromContextDidSaveNotification:note]; } – flizit 2012-03-02 20:57:20

+0

对不起,上面的评论看起来很糟糕。无论如何,我背景这个处理理论上保持主线程尽可能自由。我完全可以调整以了解主线程与后台处理对性能的影响。 – flizit 2012-03-02 20:59:01

2

我发现它有助于并发访问同一应用程序各部分之间共享的一组数据,以便在实际删除它们之前使用标记对象作为废弃对象。

这使得更容易捕获过时数据的请求并做出适当的响应。

通常我会有某种数据管理器singleton类来处理所有访问。该标志可以是实体的时间戳属性,标记对象的最后访问。标记对象的实际删除发生在没有其他请求处于队列中并且对象未被使用一定时间的情况下。

根据数据的类型和数量以及更改的频率,这种方法可能需要细化。

+0

感谢您的回复。恐怕我不得不添加很多代码来管理这种类型的实现,但它听起来不错。 – flizit 2012-03-02 21:06:43