Нужно ли выполнять чтение основных данных в PerformBlock при использовании NSMainQueueConcurrencyType?

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

12
задан Community 23 May 2017 в 11:54
поделиться