Swift 2では、次のコードでキューを作成できました。
let concurrentQueue = dispatch_queue_create("com.Swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
しかし、これはSwift 3ではコンパイルされません。
これをSwift 3で書くための好ましい方法は何ですか?
並行キューの作成
let concurrentQueue = DispatchQueue(label: "queuename", attributes: .concurrent)
concurrentQueue.sync {
}
シリアルキューを作成する
let serialQueue = DispatchQueue(label: "queuename")
serialQueue.sync {
}
メインキューを非同期に取得する
DispatchQueue.main.async {
}
メインキューを同期的に取得
DispatchQueue.main.sync {
}
バックグラウンドスレッドの1つを取得する
DispatchQueue.global(qos: .background).async {
}
Xcode 8.2 beta 2:
バックグラウンドスレッドの1つを取得する
DispatchQueue.global(qos: .default).async {
}
DispatchQueue.global().async {
// qos' default value is ´DispatchQoS.QoSClass.default`
}
これらのキューの使い方について知りたい場合はこちらを参照してください 答え
Swift 3 の下でコンパイルします。この例には、必要な構文のほとんどが含まれています。
QoS - 新しいサービス品質構文
weak self
- 保持サイクルを中断します
自分自身が利用できない場合は、何もしません。
async global background queue
- ネットワーククエリ用
async main queue
- UIに触れるため.
もちろん、これにエラーチェックを追加する必要があります。
DispatchQueue.global(qos: .background).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
}
}
}
}
XCode 8、Swift 3でコンパイル https://github.com/rpthomas/Jedisware
@IBAction func tap(_ sender: AnyObject) {
let thisEmail = "emailaddress.com"
let thisPassword = "myPassword"
DispatchQueue.global(qos: .background).async {
// Validate user input
let result = self.validate(thisEmail, password: thisPassword)
// Go back to the main thread to update the UI
DispatchQueue.main.async {
if !result
{
self.displayFailureAlert()
}
}
}
}
OPの質問はすでに上記のように回答されているので、速度に関する考慮事項をいくつか追加します。
DispatchQueue.global で非同期関数にどの優先順位クラスを割り当てるかによって、大きな違いが生じます。
特にタスクが低電力コアに割り当てられていると思われるiPhone Xで、 .background スレッド優先順位でタスクを実行することはお勧めしません。
これは、XMLファイルから(バッファリングを使用して)読み取り、データ補間を実行する、計算量の多い関数からの実際のデータです。
デバイス名/ .background / .utility / .default / .userInitiated / .userInteractive
データセットはすべてのデバイスで同じというわけではありません。これはiPhone Xで最大、iPhone 5では最小です。
UITableViewやUIPickerViewのようにユーザーに気付かれずに新しいデータを表示するためにUIを更新したい場合、これは特に重要です。
DispatchQueue.main.async
{
/*Write your thread code here*/
}
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
}
//ビューコントローラにオブジェクト(ラベル、イメージビュー、テキストビュー)を追加する必要がある場合はオペレーションキューを使用します
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
}
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バージョンとは対照的に変更はマークされます。
スイフト3
swiftコードで何らかのクロージャを呼び出して、ストーリーボードで変更したいと思います。
しかしあなたはあなたのアプリケーションがクラッシュしないディスパッチ方法を使いたいです
非同期メソッド
DispatchQueue.main.async
{
//Write code here
}
同期方法
DispatchQueue.main.sync
{
//Write code here
}
let newQueue = DispatchQueue(label: "newname")
newQueue.sync {
// your code
}
スイフト3用
DispatchQueue.main.async {
// Write your code here
}
Swift 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ドキュメント から:
パラメータ
label
インストルメント、サンプル、スタックショット、クラッシュレポートなどのデバッグツールでキューを一意に識別するためにキューに添付する文字列ラベル。アプリケーション、ライブラリ、およびフレームワークはすべて独自のディスパッチキューを作成できるため、リバースDNS命名スタイル(com.example.myqueue)が推奨されます。このパラメーターはオプションであり、NULLにすることができます。
qos
キューに関連付けるサービス品質レベル。この値は、システムが実行するタスクをスケジュールする優先順位を決定します。可能な値のリストについては、DispatchQoS.QoSClassを参照してください。
属性
キューに関連付ける属性。並行属性を含めて、タスクを並行して実行するディスパッチキューを作成します。この属性を省略すると、ディスパッチキューはタスクを連続して実行します。
autoreleaseFrequency
キューがスケジュールするブロックによって作成されたオブジェクトを自動解放する頻度。可能な値のリストについては、 DispatchQueue.AutoreleaseFrequency を参照してください。
ターゲット
ブロックを実行するターゲットキュー。システムに現在のオブジェクトに適したキューを提供させたい場合は、DISPATCH_TARGET_QUEUE_DEFAULTを指定します。