比方说,我们有需要显示的地点列表,并可以运行在3个线程的应用程序:NSManagedObjectContexts和多线程
- 主线
- 主线程后台同步(同步 地方与服务器)
- 天气预报 线程(地理编码在 背景的地方)
在所有3个线程我有d编号为NSManagedObjectContexts
(MOCs)。如果每个MOC都可以更改底层数据(主线程可以将该地点添加到收藏夹中,而后台同步可以更改该地点的名称,而地址解码线程添加纬度/经度信息),则应用程序必须注册NSManagedObjectContextDidSaveNotification
每个线程,然后散布mergeChangesFromContextDidSaveNotification
到其他线程中的相应的其他线程,如果一个MOC得到保存(不只是合并到主线程的MOC),正确的???
因为现在我这样做,并没有觉得不对劲:(
我有一本字典,我使用到当前正在运行的线程保存它们的MOCS。每当MOCS的一个弹出NSManagedObjectContextDidSaveNotification
我循环遍历这个数组并发送mergeChangesFromContextDidSaveNotification
到所有其他的MOC/Threads。当然,我还在NSThreadWillExitNotification
上添加了一个观察者,这样当其中一个线程用完时,我可以从数组中移除Thread/MOC。字典被锁定 这就是我现在有点被卡住的情况,有时当我打电话时
[moc performSelector:@selector(mergeChangesFromContextDidSaveNotification:)
onThread:thread
withObject:notification
waitUntilDone:YES];
通过MOCS /线程词典循环时
,我得到下面的异常扔给我:
[NSManagedObjectContext performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform
显然,这是由竞争条件引起的。在循环字典时(我只在提取其对象数组的同时将其锁定),退出时的线程之一,因此引用无效。但是,如果我把字典锁在整个循环的面前,我得到了僵局,因为呼叫
[moc performSelector:@selector(mergeChangesFromContextDidSaveNotification:)
onThread:thread
withObject:notification
waitUntilDone:YES];
内环路在某些情况下需要永远(不知道为什么还没有),从而导致整个应用程序停止。 在这种情况下与waitUntilDone:NO
打电话安全吗?因为这似乎解决了它。我只是不知道,如果我不小心打开潘多拉这个箱子....
问候,
塞巴斯蒂安