Согласно ответу Даниэля Эггертта в на этот вопрос , при использовании контекста управляемого объекта с 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:
в новом контроллере представления?