如何确保某些ID仅在核心数据中出现一次?

时间:2013-01-27 17:49:16

标签: objective-c core-data xcode4.5

到目前为止,这是我尝试过的:

+(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都具有相同的父级,即在主线程上创建的主要managedobject上下文。

当LookUpObjectWithAttributeValue内的executeFetchRequest停止时发生锁定。另一方面,主线程也停止在@synchronized(self)。

我想知道如何解决这个问题?

我应该确保主要的managedObjectContext不与主线程相关联吗?

1 个答案:

答案 0 :(得分:0)

我很少直接访问核心数据。因此,整个程序中只有一行代码执行excecuteFetchRequest,例如。

每次孩子间接访问父母

时,我都会执行BlockAndWait
[moc performBlockAndWait:^{
    saveSuccesfully = [moc save:&error];
    if (!saveSuccesfully) {
        CLog(@"Error in Saving %@", error);
    }
    else{
    }
}];

[moc performBlockAndWait:^{
    fetchedObjects = [moc executeFetchRequest:request error:&error];
}];

    [moc performBlock:^{
        if (![moc save:&error])
        {
            CLog(@"Error in Saving %@", error);// handle error
        }
    }];

此后再没有死锁。