簡體   English   中英

dispatch_get_main_queue的奇怪行為

[英]Strange behavior of dispatch_get_main_queue

我有一個啟用了分頁的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(), {...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM