我的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];
有什么办法解决吗?并保持我的请求返回此方法上的结果对象?
谢谢!
最佳答案
在MOC上进行同步表明,有多个线程在访问同一MOC。
这本身就是对CoreData并发协议的违反。
除非将此访问包装在上下文performBlock:
方法(或其对应的“wait”对象)中,否则将禁止该访问。这将完全不需要@synchronized
块。
此线程/队列的“边界”扩展到获取/注册的托管对象的上下文,因此,您将无法访问它们作为方法的返回值。
关于ios - 核心数据卡住了所有应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23773466/