簡體   English   中英

swift中后台隊列的性能?

[英]Performance of background queue in swift?

這里跟進我的問題。

我有一個方法lotsOfWork()可能需要一些時間才能完成。 在運行時,用戶需要等待它完成。 我想向用戶提供反饋,以便他看到發生了什么。

我現在有以下代碼來運行我的lotsOfWork()方法,同時允許它更新顯示其進度的標簽:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        DispatchQueue.global(qos: .background).async {
            self.lotsOfWork()
        }
    }

    func lotsOfWork() {
        for i in 1...10 {
            DispatchQueue.main.async {
                self.label.text = "Working on item \(i)..."
            }
            sleep(1) // Simulating lots of work
        }
    }
}

但這也意味着lotsOfWork()方法將在后台隊列中執行,而不是在main中執行。

當lotsOfWork()運行時,主隊列中沒有任何事情發生 - 除了更新標簽。 除了等待,用戶不能做任何事情。

問題1:這是一個重大的性能問題嗎? 這項工作需要更多時間才能完成嗎?

問題2:如果這是一個問題,有沒有辦法讓lotOfWork()方法在main中運行, 同時仍然能夠更新label.text

我嘗試使用DispatchQueue.main.async甚至2個嵌套的DispatchQueue.main.async,但這不會更新label.text。

我也嘗試使用setNeedsDisplay()和setNeedsLayout(),但這並沒有改變任何東西。

在main中執行lotsOfWork()不是問題,因為用戶需要等待這項工作完成才能繼續。 但是如果lotsOfWork()在main中運行,我無法實時更新label.text。

您請求的QoS(服務質量)不正確。 你已經要求background

用於非用戶啟動或可見的工作。 通常,用戶不會意識到這項工作甚至正在發生。 例如,預讀內容,搜索索引,備份或與外部系統同步數據。

后台任務是優先級最低的任務,原則上可能永遠不會執行(至少,您應該願意接受數小時或更長時間的延遲)。

如果用戶請求了操作並且必須等待它完成,那么正確的QoS是.userInitiated

用於執行用戶明確請求的工作,並且必須立即顯示結果以允許進一步的用戶交互。 例如,在用戶在消息列表中選擇電子郵件后加載電子郵件。

這個QoS級別可以(並且經常)與主隊列一樣高效,但您通常應該避免借調猜測系統將執行的操作,並確保使用與意圖匹配的QoS標記操作。 所有這些的最佳介紹是在Swift 3中使用GCD進行並發編程

我通常發現當人們選擇.background (最低的QoS)時,他們通常意味着.utility ,當他們選擇.userInteractive (最高級別)時,他們通常意味着.userInitiated 最高級別和最低級別具有非常特殊的用例,這些用例不常出現。 如果您在不到一天的時間內需要結果,那么您並不是指.background ,如果完成時間超過.background ,則.userInteractive

  1. 根據Apple文檔在此處找到:

由於優先級較高的工作比低優先級工作執行得更快,資源更多,因此通常需要比低優先級工作更多的能量。 為您的應用程序執行的工作准確指定適當的QoS類可確保您的應用程序具有響應性和節能性。

答案是肯定的 較低優先級隊列可能獲得較少的資源,因此執行速度較慢。

  1. 答案是否定的 在不阻止UI更新的情況下,您無法在main上執行相對繁重的工作。

如果你對學習Swift中的Concurrency感興趣,我建議你閱讀Umberto Raimondi創建的這篇文章 這是迄今為止我見過的最好的Swift並發指南。

暫無
暫無

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

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