当使用NSPrivateQueueConcurrencyType
和NSMainQueueConcurrencyType
类型时NSManagedObjectContext
,在同一个上下文中进行嵌套的 performBlock 调用是否安全?
[backgroundContext performBlock:^{
NSFetchRequest *myRequest = ...;
__block NSArray *result= nil;
[backgroundContext performBlockAndWait:^{
results = [backgroundContext executeFetchRequest:myRequest error:NULL];
}];
}];
这可能看起来很愚蠢,但我有一个现有的代码库,其中包含许多封装executeFetchRequest
调用的辅助方法。我不想假设调用者是否已经使用了 performBlock。例如:
-(void)updateObjects:(BOOL)synchronous
{
if (YES == synchronous)
[self fetchHelper];
else
{
[backgroundContext performBlock:^{
[self fetchHelper];
}];
}
}
-(NSArray*)fetchHelper
{
[self.backgroundContext performBlockAndWait:^{
//Fetch the objects...
[self.backgroundContext executeFetchRequest: (...)];
}];
}
我已经尝试过了,它有效。但我已经学会了(艰难的方式)对 Core Data 和多线程非常小心。