256

Swift 2.x (または 1.x) プロジェクトには、次のようなコードがたくさんあります。

// Move to a background thread to do some long running work
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    dispatch_async(dispatch_get_main_queue()) {
        self.imageView.image = image
    }
}

または、次のようにして実行を遅らせます。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) {
    print("test")
}

または、Grand Central Dispatch API のあらゆる種類のその他の用途...

Swift 3 の Xcode 8 (ベータ版) でプロジェクトを開いたので、あらゆる種類のエラーが発生します。そのうちのいくつかは私のコードを修正することを提案していますが、すべての修正で動作するコードが生成されるわけではありません。これについてどうすればよいですか?

4

6 に答える 6

356

最初から、Swift は ObjC と C をより Swifty にするためのいくつかの機能を提供しており、バージョンごとに機能が追加されています。現在、Swift 3 では、新しい「メンバーとしてインポート」機能により、特定のスタイルの C API を持つフレームワークが可能になります。クラスのように機能するデータ型と、それを操作するための一連のグローバル関数があります。 Swift ネイティブ API のように動作します。データ型は Swift クラスとしてインポートされ、関連するグローバル関数はそれらのクラスのメソッドおよびプロパティとしてインポートされ、定数のセットなどの関連するものは、必要に応じてサブタイプになることができます。

Xcode 8 / Swift 3 ベータ版では、Apple はこの機能を (他のいくつかの機能と共に) 適用して、Dispatch フレームワークをより迅速にしました。(そしてCore Graphicsも。) Swift のオープンソースへの取り組みをフォローしている場合、これはニュースではありませんが、Xcode の一部として初めて登場しました。

プロジェクトを Swift 3 に移行するための最初のステップは、Xcode 8 でプロジェクトを開き、メニューで[編集] > [変換] > [現在の Swift 構文に... ] を選択することです。これにより、名前が変更されたすべての API とその他の変更に必要なすべての変更が (確認と承認を得て) 一度に適用されます。(多くの場合、コード行は一度に複数の変更の影響を受けるため、エラーの修正に個別に対応すると、すべてが正しく処理されない場合があります。)

その結果、作業をバックグラウンドにバウンスして戻す一般的なパターンは次のようになります。

// Move to a background thread to do some long running work
DispatchQueue.global(qos: .userInitiated).async {
    let image = self.loadOrGenerateAnImage()
    // Bounce back to the main thread to update the UI
    DispatchQueue.main.async {
        self.imageView.image = image
    }
}

古い定数.userInitiatedの代わりに使用していることに注意してください。DISPATCH_QUEUE_PRIORITYQuality of Service (QoS) 指定子は OS X 10.10 / iOS 8.0 で導入され、システムが作業に優先順位を付けるためのより明確な方法を提供し、古い優先指定子を非推奨にしました。詳細については、バックグラウンド作業とエネルギー効率に関するApple のドキュメントを参照してください。

ところで、作業を整理するために独自のキューを保持している場合、キューを取得する方法は次のようになります (これDispatchQueueAttributesOptionSetであるため、コレクション スタイルのリテラルを使用してオプションを組み合わせます)。

class Foo { 
    let queue = DispatchQueue(label: "com.example.my-serial-queue",
                           attributes: [.serial, .qosUtility])
    func doStuff() {
        queue.async {
            print("Hello World")
        }
    }
}

dispatch_after後で仕事をするために使用しますか?これもキューのメソッドでありDispatchTime、さまざまな数値型の演算子を持つ が必要なため、整数秒または小数秒を追加できます。

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { // in half a second...
    print("Are we there yet?")
}

Xcode 8 でそのインターフェイスを開くことで、新しい Dispatch API を使用する方法を見つけることができますDispatchQueue。Open Quickly を使用して Dispatch モジュールを見つけるか、Swift プロジェクト/プレイグラウンドにシンボル ( など) を配置してコマンドクリックし、ブラウズします。そこからモジュール。(Swift Dispatch API は、Apple の気の利いた新しい API リファレンス Web サイトと Xcode 内のドキュメント ビューアーで見つけることができますが、C バージョンのドキュメント コンテンツはまだそこに移動していないようです。)

その他のヒントについては、移行ガイドを参照してください。

于 2016-06-14T00:58:40.560 に答える
149

Xcode 8 beta 4 では動作しません...

使用する:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
    print("Are we there yet?")
}

非同期の 2 つの方法:

DispatchQueue.main.async {
    print("Async1")
}

DispatchQueue.main.async( execute: {
    print("Async2")
})
于 2016-08-13T08:54:34.867 に答える