2013-10-15 55 views
0

我有一个在后台运行的刷新过程(只使用performInBackground就是全部),其中的一部分有db更新,所以我有一个单独的后台线程MOC。然后,我使用didSave通知将更改合并到主MOC中。当应用在后台刷新时,用户可以点击UI。核心数据锁因为合并?

大部分工作,但我偶尔看到一些锁。当我查看锁之前调用的方法时,它访问主MOC。我的刷新过程中没有任何内容访问此内容,所有内容都访问后台MOC。但是,我一直在想,我对后台MOC所做的更改通过didSave通知进行合并。如果我在尝试查询一个MOC的同时执行mergeChangesFromContextDidSaveNotification,那会是问题吗?最好的解决办法是什么?我以为我已经用我的后台线程的单独MOC解决了我的数据库问题,但合并会成为一个问题吗?

回答

1

你是在正确的轨道上。每个线程使用自己的MOC;并在后台线程更新数据时主UI线程获取通知。您所描述的内容中没有任何内容会导致锁定。您所遇到的锁很可能是主线程中执行长时间运行的代码导致的结果,阻塞了UI,而您认为此过程是在后台线程中完成的。

+0

非常感谢!所以合并不是问题?我担心访问一个moc这合并会是一个问题,但它可以处理?我不需要第三个MOC(一个主要,一个背景,一个用于背景合并)或类似的东西?你可以扩展锁的可能原因吗?我不认为我之前用我的代码遇到过这种情况,现在只是在重新构建背景资料之后。例如,病态发起,然后不对UI做任何其他事情,我只是放手。但即时通讯仍然看到[NSPersistentStoreCoordinator锁定],[_PFLock锁定],pthread_mutex_lock,_psynch_mutexwait – skinsfan00atg

+0

不需要您描述的第三个MOC。当代码在主线程中运行时,我遇到了锁,​​但我并不打算这么做;例如,如果您对在主线程上执行的回调和通知执行任何数据处理。我的主要moc分配如下:newMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType],我的背景只是:newMoc = [[NSManagedObjectContext alloc] init]。 – Rudy

+0

非常感谢回复,很高兴知道我不需要第三。所以如果在我的主线程中访问主MOC,它是如何工作的?我可以访问它,它知道如何给我数据,即使它可能合并?我是否需要在主线程上调用合并?我的主要MOC我也使用alloc init,但没有并发类型。是否就像在init中使用那样容易使用? – skinsfan00atg