По словам Даниэля Эггерт, ответьте на этот вопрос, при использовании контекста управляемого объекта с 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
?
Это, конечно, немного надуманный пример, но было бы неплохо безопасно передать этот виджет, например, для модального контроллера представлений, которому необходимо получить доступ к некоторым свойствам виджета. Должен ли я передавать идентификатор объекта widget вместо этого и повторять его в performBlock:
в новом контроллере представления?