Подтвердить что ты не робот

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.

4b9b3361

Ответ 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);
    }
});