我在iOS应用上遇到Core Data
并发问题。
在我的executeFetchRequest
上,我尝试同步managedObjectContext
请求,但有时此方法会冻结我的应用。
- (NSArray *)synchronizedWithFetchRequest:(NSFetchRequest *)request andError:(NSError **)error
{
@synchronized(self.managedObjectContext)
{
return [self.managedObjectContext executeFetchRequest:request error:error];
}
}
我已经尝试了许多内容,例如lock
/ unlock
,performBlock
/ performBlockAndWait
,dispatch_sync
/ dispatch_async
,似乎没有工作
托管对象上下文创建:
...
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
有什么方法可以解决这个问题吗?并保持我的请求返回此方法的结果对象?
谢谢!
答案 0 :(得分:1)
在MOC上同步表明有多个线程访问同一个MOC
这本身就违反了CoreData并发协议。
禁止此访问,除非它包含在上下文performBlock:
方法(或其"等待"对应方)中。这将完全否定对@synchronized
块的需求。
此线程/队列"绑定"扩展到上下文提取/注册的托管对象,因此,您将无法访问它们作为方法的返回值。