我有一个启用了页面调度的UIScrollView,我想显示一些带有图像的“页面”。

我将第一页的图像加载到主线程中并显示它。然后,我开始在后台线程中加载其他页面图像

    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_get_main_queue(), ^{ ...。并且只需确保在分派主队列中的任何内容时检查您是否不在主线程上(在这里,您非常安全,但这通常是个好习惯,否则您可能会遇到锁定)。

因此完整的代码将是

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

关于ios - dispatch_get_main_queue的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19047886/

10-13 05:08