CoreData:在后台更新并在主线程中读取会导致死锁

swa*_*ner 6 deadlock core-data objective-c

我正在向用户显示包含一些数据的表格.一旦显示视图,我正在进行Web调用以查看是否有更新的数据(异步).当服务调用返回时,我想更新我的核心数据和视图.

不幸的是,我经常得到死锁,因为视图读取与服务调用写入相同的数据.我怎么解决这个问题?

当我在模拟器冻结时暂停模拟器时,等待的线程在以下位置等待:

后台(更新)线程:(psynch_cvwait)

[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                              withObject:notification
                           waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)

主线程:( psynch_mutexwait)执行一个 filteredArrayUsingPredicate

非常感谢!

Mar*_*rra 8

-mergeChangesFromContextDidSaveNotification:将阻止主线程.该调用将锁定两个NSManagedObjectContext实例,同时更新主要上下文并传入更改.

在iOS 5之前的应用中,这通常被认为是不可避免的.您可以通过更频繁,更小的保存来最小化它,但它仍然会发生.

iOS 5之前的应用程序唯一的另一个选择是告诉主要上下文,-reset:但这需要重新获取所有内容 - 另一个延迟.