Ответ 1
Методы performBlock:
и performBlockAndWait:
используются для отправки сообщений на ваш экземпляр NSManagedObjectContext
, если MOC был инициализирован с помощью NSPrivateQueueConcurrencyType
или NSMainQueueConcurrencyType
. Если вы делаете что-либо с одним из этих типов контекста, например, устанавливая постоянное сохранение или сохранение изменений, вы делаете это в блоке.
performBlock:
добавит блок в очередь резервного копирования и запланирует его запуск в своем потоке. Блок немедленно вернется. Вы можете использовать это для длительных операций сохранения в хранилище резервных копий.
performBlockAndWait:
также добавит блок в очередь резервного копирования и запланирует его запуск в своем потоке. Однако блок не вернется, пока блок не завершит выполнение. Если вы не можете двигаться дальше, пока не узнаете, была ли операция успешной, тогда это ваш выбор.
Например:
__block NSError *error = nil;
[context performBlockAndWait:^{
myManagedData.field = @"Hello";
[context save:&error];
}];
if (error) {
// handle the error.
}
Обратите внимание, что поскольку я сделал performBlockAndWait:
, я могу получить доступ к ошибке за пределами блока. performBlock:
потребуется другой подход.
Из примечания по выпуску основных данных iOS 5:
NSManagedObjectContext теперь предоставляет структурированную поддержку для одновременных операций. Когда вы создаете контекст управляемого объекта с помощью initWithConcurrencyType:, у вас есть три варианта для своей ассоциации потоков (очереди)
Конфайнмент (NSConfinementConcurrencyType).
Это значение по умолчанию. Вы обещаете, что этот контекст не будет использоваться ни одним потоком, кроме того, на котором вы его создали. (Это то же самое требование к потоку, которое вы использовали в предыдущих выпусках.)
Частная очередь (NSPrivateQueueConcurrencyType).
Контекст создает и управляет частной очередью. Вместо того, чтобы создавать и управлять потоком или очередью, с которой связан контекст, здесь контекст владеет очередью и управляет всеми подробностями для вас (при условии, что вы используете методы на основе блоков, как описано ниже).
Основная очередь (NSMainQueueConcurrencyType).
Контекст связан с основной очередью и как таковой связан с циклом событий приложений, но в остальном он похож на частный контекст на основе очереди. Этот тип очереди используется для контекстов, связанных с контроллерами и объектами пользовательского интерфейса, которые должны использоваться только в основном потоке.