0

У меня есть UIScrollView с включенным пейджингом, и я хочу показать некоторые «страницы» с изображениями.Странное поведение dispatch_get_main_queue

Загружаю изображения первой страницы в основной теме и показываю ее. Тогда я начинаю загрузку других страниц изображений в фоновом потоке

dispatch_async(loadingImagesQueue, ^{ 
      for (int i = 0; i < numberOfImages; i++) { 
       NSString *imagePath = [arrayWithImagePaths objectAtIndex:i]; 
       UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 

       dispatch_async(dispatch_get_main_queue(), ^{ 
         NSLog(@"Posting notification\n\n"); 
         [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_NAME_IMAGE_PREPARED object:image]; 
       }); 
      } 
    }); 

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

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

Но по какой-то причине он сначала загружает все изображения, и только после этого начинает создавать новые страницы. Я вижу это по сообщениям журнала. И самое странное, что существует большая задержка (около 0,5 секунды) между окончанием загрузки последнего изображения и началом создания новой страницы.

Может ли кто-нибудь объяснить, в чем причина этого странного поведения?

ответ

1

Вы вызываете dispatch_async. Если вы хотите выполнить уведомление в тот самый момент в вызове основной очереди dispatch_sync(dispatch_get_main_queue(), ^{ .... И просто убедитесь, что вы не находитесь в основном потоке уже при отправке чего-либо в главной очереди (здесь вы в значительной степени безопасны, но обычно это хорошая практика, иначе вы можете столкнуться с блокировкой).

Так что полный код будет

if([NSThread isMainThread] == NO){ dispatch_sync(dispatch_get_main_queue(), {....

+0

Благодарим вас за ответ. Как я знаю, единственная разница между dispatch_async и dispatch_sync заключается в том, что dispatch_sync заставляет поток bg ждать результата выполнения блока, в то время как dispatch_async разрешает запуск потока bg одновременно. Поэтому оба они должны бежать в тот самый момент. – tagirkaZ

+1

Дело о dispatch_async заключается в том, что он не будет выполнять блок в указанной вами очереди, а ENQUEUE. Вот почему вы получаете странные результаты. Блоки блокируются в основном потоке, и вы на самом деле не уверены, когда они будут выполняться. – Mercurial

Смежные вопросы