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

Posted

技术标签:

【中文标题】如何确保某个 ID 在核心数据中只出现一次?【英文标题】:How to ensure that certain ID shows up only once in core data? 【发布时间】:2013-01-27 17:49:16 【问题描述】:

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

+(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 不与主线程关联?

【问题讨论】:

【参考方案1】:

我很少直接访问核心数据。所以整个程序中只有一行代码执行了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
        
    ];

从那以后再也没有死锁。

【讨论】:

以上是关于如何确保某个 ID 在核心数据中只出现一次?的主要内容,如果未能解决你的问题,请参考以下文章

确保在 Kafka Connect 中只交付一次

如何从核心数据中的实体中获取所有项目的列表,每个项目只出现一次?

如何在while循环中只打印一次帖子?

经典算法——数组中只出现一次的数字

数组中只出现一次的数字

如何在 React hooks 和 redux 中只获取一次且不再获取数据