web-dev-qa-db-ja.com

Swift 3でディスパッチキューを作成する方法

Swift 2では、次のコードでキューを作成できました。

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

しかし、これはSwift 3ではコンパイルされません。

これをSwift 3で書くための好ましい方法は何ですか?

373
user4790024

並行キューの作成

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`
}

これらのキューの使い方について知りたい場合はこちらを参照してください 答え

1059
LC 웃

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
            }
        }
    }
}
52
t1ser

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()
            }

        }
    }

}
28
R Thomas

OPの質問はすでに上記のように回答されているので、速度に関する考慮事項をいくつか追加します。

DispatchQueue.global で非同期関数にどの優先順位クラスを割り当てるかによって、大きな違いが生じます。

特にタスクが低電力コアに割り当てられていると思われるiPhone Xで、 .background スレッド優先順位でタスクを実行することはお勧めしません。

これは、XMLファイルから(バッファリングを使用して)読み取り、データ補間を実行する、計算量の多い関数からの実際のデータです。

デバイス名/ .background / .utility / .default / .userInitiated / .userInteractive

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

データセットはすべてのデバイスで同じというわけではありません。これはiPhone Xで最大、iPhone 5では最小です。

9
Cosmin

UITableViewやUIPickerViewのようにユーザーに気付かれずに新しいデータを表示するためにUIを更新したい場合、これは特に重要です。

    DispatchQueue.main.async
 {
   /*Write your thread code here*/
 }
6
Asfand Shabbir
 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
}

//ビューコントローラにオブジェクト(ラベル、イメージビュー、テキストビュー)を追加する必要がある場合はオペレーションキューを使用します

3
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
}
2
Hitesh Chauhan
   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バージョンとは対照的に変更はマークされます。

2
gosborne3

スイフト3

swiftコードで何らかのクロージャを呼び出して、ストーリーボードで変更したいと思います。

しかしあなたはあなたのアプリケーションがクラッシュしないディスパッチ方法を使いたいです

非同期メソッド

DispatchQueue.main.async 
{
 //Write code here                                   

}

同期方法

DispatchQueue.main.sync 
{
     //Write code here                                  

}
2
Amul4608
 let newQueue = DispatchQueue(label: "newname")
 newQueue.sync { 

 // your code

 }
0
Deep

スイフト3用

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

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を指定します。

0
Mithra Singam