Для чего используется performBlock: NSManagedObjectContext?



В iOS 5, NSManagedObjectContext есть несколько новых методов,performBlock: и performBlockAndWait:. Для чего на самом деле используются эти методы? Что они заменяют в старых версиях? Какие блоки должны быть переданы им? Как я могу решить, что использовать? Если у кого-то есть примеры их использования, это было бы здорово.

575   2  

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 core data release notes:

NSManagedObjectContext теперь обеспечивает структурированную поддержку параллельных операций. При создании контекста управляемого объекта с помощью initWithConcurrencyType:, у вас есть три варианта для его ассоциации потока (очереди)

  • Конфайнмент (NSConfinementConcurrencyType).

    это по умолчанию. Вы обещаете, что контекста не будет используется любым потоком, кроме того, на котором вы его создали. (Это точно такое же требование к потокам, которое вы использовали в предыдущих выпусках.)

  • частная очередь (NSPrivateQueueConcurrencyType).

    контекст создает и управляет собственной очередью. Вместо создания и управления потоком или очередью, с которыми связан контекст, здесь контекст владеет очередью и управляет всеми деталями для вас (при условии, что вы используете блочные методы, как описано ниже).

  • Главная очередь (NSMainQueueConcurrencyType).

    контекст связан с основной очередью и как таковой привязан к циклу событий приложения, но в остальном он похож на частный контекст на основе очереди. Этот тип очереди используется для контекстов, связанных с контроллерами и объектами пользовательского интерфейса, которые должны использоваться только в главном потоке.

они позволяют вам получить доступ к той же managedObjectContext через потоки.

Я не совсем уверен, что я прав, но вот как я его использую.

вы используете performBlockAndWait как "обычно". Вам это не нужно, если вы выполняете managedObjectContext только в одном потоке. Если вы выполняете его на многих потоках, то да вам понадобится performBlock.

так что, если вы находитесь на основной поток, вам не нужно делать performBlockAndWait на главную managedObjectContext. По крайней мере, я этого не делаю и делаю штраф.

однако, если вы получите доступ к этому managedObjectContext на других потоках тогда да вам нужно будет сделать performBlockAndWait.

так вот в чем цель performBlock и performBlockAndWait.

кто-то пожалуйста, поправьте меня, если я ошибаюсь здесь. Конечно, если вы получаете доступ к контексту только в одном потоке, вы можете просто использовать значение по умолчанию.

Comments

    Ничего не найдено.