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