到目前为止,这是我尝试过的:
+(NSManagedObject *) getObjectWithStringOfValue:(NSString *) Value fromTable:(NSString*) table withAttribut:(NSString *) AttributName
{
NSManagedObject * buffer=nil;
@synchronized(self)
{
buffer=[self LookUpObjectWithAttributeValue:Value fromTable:table WithAttribut:AttributName];
if (buffer == nil)
{
//CLog( @"gk boleh create");
buffer=[self CreateNewObjectFromTable:table];
[buffer setValue:Value forKey:AttributName];
[BGMDCRManagedObjectContextThreadHandler commit];
NSAssert([self LookUpObjectWithAttributeValue:Value fromTable:table WithAttribut:AttributName], @"Object must exist and must only be one");
}
else
{
//assert(!(buffer.isFault));
}
}
return buffer;
}
基本上@synchronized 是必要的。有可能一个线程看到没有创建对象,而另一个线程做同样的事情,他们都提交了 2 个对象。
但是,这往往会导致死锁。
在我的实现中,每个线程都有自己的 moc。所以 [BGMDCRManagedObjectContextThreadHandler managedobjectcontext] 会将 moc 提供给该线程。每个 moc 都有相同的父对象,即在主线程上创建的主托管对象上下文。
当 LookUpObjectWithAttributeValue 中的 executeFetchRequest 停止时发生锁定。另一方面,主线程也会在@synchronized(self) 上停止。
我想知道如何解决这个问题?
我应该确保主 managedObjectContext 不与主线程相关联吗?