У меня есть 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 секунды) между окончанием загрузки последнего изображения и началом создания новой страницы.
Может ли кто-нибудь объяснить, в чем причина этого странного поведения?
Благодарим вас за ответ. Как я знаю, единственная разница между dispatch_async и dispatch_sync заключается в том, что dispatch_sync заставляет поток bg ждать результата выполнения блока, в то время как dispatch_async разрешает запуск потока bg одновременно. Поэтому оба они должны бежать в тот самый момент. – tagirkaZ
Дело о dispatch_async заключается в том, что он не будет выполнять блок в указанной вами очереди, а ENQUEUE. Вот почему вы получаете странные результаты. Блоки блокируются в основном потоке, и вы на самом деле не уверены, когда они будут выполняться. – Mercurial