具有并行操作的核心数据

时间:2011-02-23 17:22:39

标签: iphone core-data

我是Core Data世界的新手,我使用iOS 4作为基础框架并使用核心数据来执行针对我本地SQLight DB的操作,我正在设计离线应用程序但是在某些时候当用户上线时我需要拉来自服务器的一些更新数据并将其推送到本地数据库,同时用户可能正在执行一些插入并通过UI更新到同一个数据库中。

因此,同一个DB上会同时发生两组操作

1)用户将通过UI视图进行一些插入或更新

2)在后台运行的同步引擎可能会提取一些数据并将其推送到本地数据库

在这种情况下,可能存在[使用[context save:& error];]保存共享托管上下文的问题,因为上下文可能最终会保存错误的数据。

我可以考虑为同一个

提供两种解决方案

1)创建指向同一个DB的另一个持久存储,但这样做可能会导致设备上的内存消耗很高

2)为同步引擎创建不同的线程,但不知道如何处理它。

你们可以对此有所了解,还是我在想错误的方向?

由于 Ajay Sawant

1 个答案:

答案 0 :(得分:3)

就个人而言,我会使用线程。 (实际上,我会使用NSOperation但这只是一个花哨的线程。)

永远不要在线程之间共享托管上下文

如果您希望将事务分开(即后台更新等),请为每个事务使用不同的托管对象上下文。

您应该只使用一个persistentStoreCoordinator,但是为您应用中的每个线程创建一个managedObjectContext。

这也意味着你不能在线程之间传递托管对象,但它完全是传递objectID,即如果你想告诉主线程已完成的事情:

// On your background thread . . .

[managedObjectContext save:nil];

NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:[myThing objectID], @"id", nil];
[NSNotificationCenter defaultCenter] postNotificationName:@"something-happened" object:self userIfno:userInfo];

在主线程上,您应该使用objectWithID方法为主线程的managedObjectContext获取新的托管对象。

See this document for more details