并发枚举核心数据线程安全中的托管对象

时间:2013-04-06 17:46:10

标签: core-data thread-safety enumeration nsmanagedobjectcontext nsarraycontroller

我需要为Core Data中的每个排列对象更新一个值,而我目前正在使用循环。但我想知道以下代码是否是线程安全的,为什么

ManagedObjectContext不是线程安全的,解释here

[myArrayController.arrangedObjects enumerateObjectsWithOptions:NSEnumerationConcurrent 
                                                    usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    // do some work

    [obj setValue:@"some value" forKey:@"aKey"];            
}]

1 个答案:

答案 0 :(得分:0)

它是安全的,因为虽然块的多个副本可以同时运行,但它们都在处理不同的对象。假设您对setValue:forKey:的调用对集合中的其他对象没有副作用,当然。

不安全在某种意义上说,如果另一个线程或队列试图访问此集合中的对象,那么就没有什么可以阻止它同时弄乱同一个对象。该块不会锁定其他地方的其他操作,因此如果您可能同时在其他地方使用这些对象,则需要采取更多预防措施。