Iphone 具有并行操作的核心数据

Iphone 具有并行操作的核心数据,iphone,core-data,Iphone,Core Data,我是核心数据世界的新手,我使用iOS 4作为基本框架,并使用核心数据对我的本地SQLight DB执行操作,我正在设计脱机应用程序,但当用户联机时,我需要从服务器中提取一些更新的数据,并将其推送到本地DB中,另外,在同一时间,用户可能会执行一些插入操作,并通过UI更新到同一个DB中 因此,在同一个数据库上同时会发生两组操作 1) 用户将通过UI视图进行一些插入或更新 2) 后台运行的同步引擎可能正在提取一些数据并将其推入本地数据库 在这种情况下,[使用[context save:&error];

我是核心数据世界的新手,我使用iOS 4作为基本框架,并使用核心数据对我的本地SQLight DB执行操作,我正在设计脱机应用程序,但当用户联机时,我需要从服务器中提取一些更新的数据,并将其推送到本地DB中,另外,在同一时间,用户可能会执行一些插入操作,并通过UI更新到同一个DB中

因此,在同一个数据库上同时会发生两组操作

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

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

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

对于同一个问题,我可以考虑两种解决方案

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

2) 为同步引擎创建不同的线程,但不确定如何处理

你们能不能给这件事遮光,还是我的想法完全错了

谢谢
Ajay Sawant

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

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

如果希望事务是独立的(即后台更新等),请为每个事务使用不同的托管对象上下文

您应该只使用一个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获取新的托管对象


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

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

如果希望事务是独立的(即后台更新等),请为每个事务使用不同的托管对象上下文

您应该只使用一个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获取新的托管对象