Согласно ответу Даниэля Эггерта в на этот вопрос, при использовании контекста управляемого объекта с NSPrivateQueueConcurrencyType
необходимо делать что-нибудь, что касается его или принадлежащих ему объектов. к нему в PerformBlock:
или PerformBlockAndWait:
Верно ли то же самое для NSMainQueueConcurrencyType
? Представьте себе следующий код, работающий в основном потоке, например, в UIViewController:
self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease];
//moc setup
__block RHWidget *widget = nil;
[self.moc performBlockAndWait:^{
widget = [(RHWidget *)[self.moc objectWithID:self.widgetObjectID] retain];
}];
self.labelView.text = widget.descriptionString;
[widget release];
Безопасно ли использовать виджет вне блока, поскольку мы знаем, что находимся в основном потоке? Или необходимо сделать следующее:
__block NSString *description = nil;
[self.moc performBlockAndWait:^{
RHWidget *widget = (RHWidget *)[self.moc objectWithID:self.widgetObjectID];
description = [widget.descriptionString copy];
}];
self.labelView.text = description;
[description release];
Изменится ли что-то, если есть другой NSManagedObjectContext
, возможно, типа частной очереди, выполняющий работу в блоках и отправляющий изменения в self.moc как parentContext
?
Конечно, это немного надуманный пример, но было бы неплохо безопасно передать этот виджет, например, модальному контроллеру представления, которому требуется доступ к некоторым свойствам виджета. Должен ли я вместо этого передавать objectID виджета и повторно получать его в PerformBlock:
в новом контроллере представления?