При использовании типов 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 и многопоточностью -.