В iOS 5, NSManagedObjectContext
имеет пару новых методов performBlock:
и performBlockAndWait:
. Для чего используются эти методы? Что они заменяют в более старых версиях? Какие блоки должны быть переданы им? Как я могу решить, что использовать? Если у кого-то есть примеры их использования, было бы здорово.
Что такое NSManagedObjectContext executeBlock: используется для?
Ответ 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).
Контекст связан с основной очередью и как таковой связан с циклом событий приложений, но в остальном он похож на частный контекст на основе очереди. Этот тип очереди используется для контекстов, связанных с контроллерами и объектами пользовательского интерфейса, которые должны использоваться только в основном потоке.
Ответ 2
Они позволяют вам получать доступ к тем же managedObjectContext
сквозным потокам.
Я не уверен, что я прав, но вот как я его использую.
Вы используете performBlockAndWait
, как "обычный". Это вам не нужно, если вы выполняете управляемый объектObjectContext только в одном потоке. Если вы выполните его во многих потоках, тогда да вам понадобится performBlock
.
Итак, если вы находитесь в основном потоке, вам не нужно делать performBlockAndWait
для основного managedObjectContext
. По крайней мере, я не делаю и все в порядке.
Однако, если вы получаете доступ к этому managedObjectContext
для других потоков, тогда да, вам нужно будет сделать performBlockAndWait
.
Итак, цель performBlock
и performBlockAndWait
.
Кто-то, пожалуйста, поправьте меня, если я ошибаюсь здесь. Конечно, если вы используете контекст только в одном потоке, вы можете просто использовать значение по умолчанию.