簡體   English   中英

dispatch_async(dispatch_get_main_queue(),^ {}); 從iOS7背景線程慢

[英]dispatch_async(dispatch_get_main_queue(), ^{}); from Background Thread slow on iOS7

我在iOS7上發現了一個奇怪的行為。 我有一個dispatch_async后台線程處理繁重的負載,我想要更新UI。 所以我做了如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

    [self heavyFunction];

    dispatch_async(dispatch_get_main_queue(), ^{

        [self updateUI];

    });
});

在iOS 8及以上版本中,上述代碼按照建議工作,但在iOS7測試設備(iPhone 4s)上運行對dispatch_async的調用dispatch_async(dispatch_get_main_queue(), ^{}); 每次需要4秒鍾。 我已經完成了更新和重功能,同樣的行為仍然出現。 然后我建立了一個最小的例子,它沒有出現。 所以我想也許其他東西阻止我在iOS7上的main_queue,但我無法弄清楚這應該是什么。 [self heavyfunction];之前,這個ViewController上沒有其他UI相關的東西發生[self heavyfunction]; 飾面。

所有內容都使用XCode 7.3.1與Base SDK 9.3和Deployment Target 7.0進行編譯。

有沒有人已經有過這種行為,可能會指出我可能阻止的方向嗎?

因此,經過一些研究后我發現了這個問題。 我從后端通過后台線程調用通知(通過NSNotificationCenter ),並從兩個不同的ViewController獲取此通知以更新UITableViews的數據源。 第二個(掛起的)位於第一個下面的NavigationController層次結構中。

兩個通知都會在同一時間處理,並且UI會在兩個控制器上重新加載,即使第一個通知根本不可見。 但這似乎恰好發生在iOS 7上。所有上述iOS版本都沒有從看似無形的ViewController重新加載UI。

當我在ViewControllers之間跳轉時,UI上的所有內容都以任何方式更新,因為數據源從后台線程更新,所以我通過檢查現在顯示哪個展位ViewControllers並僅重新加載UI來解決問題。

仍然讓我感到困惑的是,iOS 7以上的所有iOS版本似乎都會自動處理這個問題,但iOS 7卻沒有。

暫無
暫無

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

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