我目前在一个(非常)大的应用程序开发的其他东西。
它开发得很好,代码看起来也不错.而不是访问核心数据。
实际上,每次访问ManagedObjectContexts都是在几个块中进行的,对应于几个web服务.在几个线上。
文件上说这很糟糕。这就是为什么有时候,我的应用程序会冻结核心数据访问。
是的,我知道我应该
为每个线程创建单独的托管对象上下文,并共享一个持久存储协调器。
正如文档所述,但是代码已经存在,而且非常庞大,我的客户端需要一个快速的解决方案(就像往常一样)。
,所以问题是:
我见过一种[managedObjectContext lock]方法。好像是些信号量的东西。但医生没怎么说。
我的webservices,在不同的线程中使用相同的managedObjectContext实例。
-What,你想做什么
[managedObjectContext lock]
// core data access
// core data access
// core data access
[managedObjectContext unlock]在我的每个web服务块中?
-Will这解决了冻结?
-Is是推荐的方法吗?
没有人告诉我关于lock & unlock 方法的信息,所以我做了一个编辑:
由于解冻并不是每次都会发生,所以我尝试了三种情况:
[managedObjectContext lock] unlock]方法@synchronized(managedObjectContext) { ... }在第一种情况下,在10次试验中发生了3次冻结。在第二和第三种情况下,根本没有冻结。
所以我的第二个问题是:
使用lock/unlock和@synchronize( )有什么不同?
发布于 2012-10-04 15:59:45
我遇到了类似的问题,在现有代码上,我没有直接工作,块在单个托管对象上下文上执行提取,最后导致了奇怪的错误、冻结、线程退出等等。
我通过在上下文中添加一个正弦化来解决这个问题:
NSBlockOperation *myBlock = [NSBlockOperation blockOperationWithBlock:^{
// block operation
@synchronized(managedObjectContext) {
NSArray *result = [managedObjectContext performFetch:myFetch];
// error management following
}
}];这是我找到的最快的解决方案。我还试图添加某种锁定条件,但在某些情况下,线程出现了混乱和死锁。
发布于 2012-10-04 16:22:30
我不知道您需要运行哪些SDK,但如果可以使用iOS 5+ -performBlock:和-performBlockAndWait:,可能正是您所需要的。
希望这能有所帮助。
https://stackoverflow.com/questions/12723795
复制相似问题