При использовании NSPrivateQueueConcurrencyType
и NSMainQueueConcurrencyType
типов для NSManagedObjectContext
, это безопасно сделать вложенные performBlock вызовы на том же контексте?Уплотненный performBlock: на NSManagedObjectContext
[backgroundContext performBlock:^{
NSFetchRequest *myRequest = ...;
__block NSArray *result= nil;
[backgroundContext performBlockAndWait:^{
results = [backgroundContext executeFetchRequest:myRequest error:NULL];
}];
}];
Это может показаться глупым, но у меня есть существующий кодовый с большим количеством методов хелперов, которые инкапсулировать executeFetchRequest
вызов. Я не хочу делать предположения о том, что вызывающий абонент уже использовал executeBlock или нет. Например:
-(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 и многопоточными.
Как насчет выполнения блокировки, это тоже реенрант? – malhal
Это не так, это рассматривается в сеансе. Ваши запросы будут стоять в очереди, если вы вызоверуете executeBlock, так как это асинхронно. –
только для того, чтобы быть понятным, что делает OP во втором бите кода, нормально делать ?, но это может вызвать проблемы, если оба метода имеют «performBlock»? это правильный способ взглянуть на это? – hokkuk