在Objective-C中执行CoreData请求是否需显式在上下文队列进行?
CoreData请求的队列执行要求
在Objective-C中使用CoreData时,是否需要显式在上下文队列执行操作,取决于上下文的并发类型以及当前代码所在的线程——框架不会自动帮你切换队列,必须自己保证操作在正确的队列上执行:
分场景说明
主队列上下文(
NSMainQueueConcurrencyType)
这种上下文绑定主线程。如果你的代码本身就在主线程中执行,直接调用:NSArray *results = [context executeFetchRequest:request error:nil];是安全的。但如果代码在后台线程,直接调用会引发线程安全问题(比如崩溃、数据不一致),此时必须用
performBlock或performBlockAndWait将操作派发到主队列执行。私有队列上下文(
NSPrivateQueueConcurrencyType)
这种上下文有独立的后台队列,无论当前代码在哪个线程,都必须通过performBlock或performBlockAndWait执行CoreData操作(包括fetch请求)。直接调用executeFetchRequest:会导致线程安全问题,必须用如下写法:__block NSArray *results = nil; [context performBlockAndWait:^{ results = [context executeFetchRequest:request error:nil]; }];
总结
- 若能确保当前线程和上下文绑定的队列一致(比如主队列上下文在主线程调用),可直接执行fetch请求;
- 不确定线程环境或使用私有队列上下文时,推荐始终使用
performBlock/performBlockAndWait——这是最安全的通用写法,能规避所有线程安全相关问题。
内容的提问来源于stack exchange,提问作者Thomas Albert
相关产品推荐
相关产品推荐

