ios - item - swift換頁




如何在Swift 3中創建調度隊列 (10)

創建並發隊列

let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {

}  

創建一個串行隊列

let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync { 

}

異步獲取主隊列

DispatchQueue.main.async {

}

同步獲取主隊列

DispatchQueue.main.sync {

}

獲取後台線程之一

DispatchQueue.global(qos: .background).async {

}

Xcode 8.2 beta 2:

獲取後台線程之一

DispatchQueue.global(qos: .default).async {

}

DispatchQueue.global().async {
    // qos' default value is ´DispatchQoS.QoSClass.default`
}

如果您想了解有關使用這些隊列的信息,請參見此 answer

在Swift 2中,我能夠使用以下代碼創建隊列:

let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)

但這在Swift 3中無法編譯。

在Swift 3中編寫此代碼的首選方式是什麼?


Swift 3 下編譯。 此示例包含我們需要的大多數語法。

QoS-新的服務質量語法

weak self -破壞保留週期

如果沒有自我,什麼也不做

async global background queue -用於網絡查詢

async main queue -用於觸摸UI。

當然,您需要為此添加一些錯誤檢查...

DispatchQueue.global(qos: .utility).async { [weak self] () -> Void in

    guard let strongSelf = self else { return }

    strongSelf.flickrPhoto.loadLargeImage { loadedFlickrPhoto, error in

        if error != nil {
            print("error:\(error)")
        } else {
            DispatchQueue.main.async { () -> Void in
                activityIndicator.removeFromSuperview()
                strongSelf.imageView.image = strongSelf.flickrPhoto.largeImage
            }
        }
    }
}

對於Swift 3

   DispatchQueue.main.async {
        // Write your code here
    }

您可以在swift 3.0中使用此代碼創建調度隊列

DispatchQueue.main.async
 {
   /*Write your code here*/
 }

   /* or */

let delayTime = DispatchTime.now() + Double(Int64(0.5 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)                   
DispatchQueue.main.asyncAfter(deadline: delayTime)
{
  /*Write your code here*/
}

現在很簡單:

let serialQueue = DispatchQueue(label: "my serial queue")

默認為串行,要並發,請使用可選屬性參數.concurrent


由於上面已經回答了OP問題,所以我只想補充一些速度方面的注意事項:

DispatchQueue.global中 分配給異步函數的優先級類別有很多不同。

我不建議以 .background 線程優先級運行任務,尤其是在iPhone X上,該任務似乎分配在低功耗內核上。

這是來自計算密集型函數的一些實際數據,該函數從XML文件讀取(帶有緩衝)並執行數據插值:

設備名稱 /.background/.utility/.default/.userInitiated/.userInteractive

  1. iPhone X:18.7秒/6.3秒/1.8秒/1.8秒/1.8秒
  2. iPhone 7:4.6s / 3.1s / 3.0s / 2.8s / 2.6s
  3. iPhone 5s:7.3s / 6.1s / 4.0s / 4.0s / 3.8s

請注意,所有設備的數據集都不相同。 它在iPhone X上最大,在iPhone 5s上最小。


迅速更新5

串行隊列

let serialQueue = DispatchQueue.init(label: "serialQueue")
serialQueue.async {
    // code to execute
}

並發隊列

let concurrentQueue = DispatchQueue.init(label: "concurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)

concurrentQueue.async {
// code to execute
}

Apple文檔

參數

標籤

附加到隊列的字符串標籤,以便在調試工具(如儀器,樣本,堆棧快照和崩潰報告)中唯一地標識它。 由於應用程序,庫和框架都可以創建自己的調度隊列,因此建議使用反向DNS命名方式(com.example.myqueue)。 此參數是可選的,可以為NULL。

服務質量

與隊列關聯的服務質量級別。 此值確定係統安排任務執行的優先級。 有關可能值的列表,請參見DispatchQoS.QoSClass。

屬性

與隊列關聯的屬性。 包括並發屬性以創建可以同時執行任務的調度隊列。 如果省略該屬性,則分派隊列將順序執行任務。

autoreleaseFrequency

自動釋放隊列調度的塊創建的對象的頻率。 有關可能的值的列表,請參見 DispatchQueue.AutoreleaseFrequency

目標

要在其上執行塊的目標隊列。 如果希望系統提供適合當前對象的隊列,請指定DISPATCH_TARGET_QUEUE_DEFAULT。


   let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT) //Swift 2 version

   let concurrentQueue = DispatchQueue(label:"com.swift3.imageQueue", attributes: .concurrent) //Swift 3 version

我在Xcode 8,Swift 3中重新編寫了您的代碼,並且所做的更改與您的Swift 2版本形成了鮮明的對比。


 DispatchQueue.main.async {
          self.collectionView?.reloadData() // Depends if you were populating a collection view or table view
    }


OperationQueue.main.addOperation {
    self.lblGenre.text = self.movGenre
}

//如果您需要在viewcontroller上填充對象(標籤,imageview,textview),請使用Operation Queue


DispatchQueue.main.async(execute: {

// write code

})

串行隊列:

let serial = DispatchQueue(label: "Queuename")

serial.sync { 

 //Code Here

}

並發隊列:

 let concurrent = DispatchQueue(label: "Queuename", attributes: .concurrent)

concurrent.sync {

 //Code Here
}






dispatch-after