Dispatch_get_global_queue vs dispatch_get_main_queue
Начало изучения основных данных и dispatch_async. Существует блок кода, чтобы получить URL-адрес изображения из набора данных и установить его в модель данных ядра, как показано ниже.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSString *urlString = [[[photoDictionary valueForKey:@"images"] objectAtIndex:0] valueForKey:@"url"];
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
dispatch_async(dispatch_get_main_queue(), ^{
[photoModel setValue:imageData forKey:@"photoImageData"];
Может кто-нибудь объяснить мне, почему мы используем dispatch_get_global_queue
для внешнего dispatch_async и dispatch_get_main_queue
для внутреннего dispatch_async.
Ответы
Ответ 1
dispatch_get_global_queue
получает фоновую очередь, на которой вы можете отправлять фоновые задачи, которые выполняются асинхронно (т.е. не блокирует ваш пользовательский интерфейс). И если вы отправите несколько блоков глобальным очередям, эти задания могут работать одновременно. Если у вас есть несколько блоков кода, которые вы хотите отправить в фоновый режим, который должен выполняться последовательно в фоновом режиме (не часто это необходимо), вы можете создать свою собственную очередность серийного фона и отправить на нее, но если параллельные фоновые операции приемлемый, тогда использование dispatch_get_global_queue
является удобным/эффективным.
Имейте в виду, что вам не разрешено выполнять обновления пользовательского интерфейса в фоновом режиме, поэтому dispatch_async
в dispatch_get_main_queue
позволяет этой фоновой очереди отправлять обновления пользовательского интерфейса обратно в основную очередь, один раз доступна основная очередь.
Это очень распространенный шаблон программирования: отправьте что-то для работы в фоновом режиме и когда ему нужно выполнить пользовательские обновления, отправьте обновление обратно в основную очередь.
Для получения дополнительной информации см. Concurrency Руководство по программированию.
Ответ 2
dispatch_get_main_queue
следует использовать в любое время, когда вы хотите манипулировать элементами пользовательского интерфейса. Это связано с сходством потоков, общей моделью для пользовательских интерфейсов. Сближение потоков означает, что вы можете управлять объектом только в потоке, на котором был создан этот объект. Для классов пользовательского интерфейса в Cocoa Нажмите, что основной поток. Это типичная идиома для интерфейсов пользовательского интерфейса на всех платформах, которые имеют значение.
Итак dispatch_get_main_queue
получает очередь, связанную с основным потоком. Не делать этого приводит к появлению странных вещей, когда ваш пользовательский интерфейс обновляется в другом потоке. Обычно я вижу длинные паузы, где пользовательский интерфейс замерзает.
dispatch_get_global_queue
получает старую очередь заданного уровня приоритета, связанного с вашим приложением. Идеально подходит для сетевых вызовов или, как в вашем случае, для работы с Core Data.
Ответ 3
Глобальная очередь предоставляет вам очередь, отличную от основного, но экономит вашу проблему при создании собственной очереди. Используйте get_main_queue, когда вам нужен ваш код для работы в главной очереди (где все ваши работы пользовательского интерфейса должны произойти)
Ответ 4
**dispatch_get_main_queue** :- Perform UI updates on this queue
dispatch_async(dispatch_get_main_queue(), ^{
[email protected]"Hello";
});
**dispatch_get_main_queue**:- Perform background tasks like downloading content
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
for (int i=0; i<100000;enter code here i++) {
NSLog(@"HIGH 1 %d", i);
}
});