当初から、SwiftはObjCとCをより迅速にするためのいくつかの機能を提供しており、バージョンごとにさらに追加しています。現在、Swift 3では、新しい「メンバーとしてインポート」機能により、特定のスタイルのC APIを持つフレームワークを使用できます-クラスのように機能するデータ型と、それを操作するための一連のグローバル関数があります- SwiftネイティブAPIのように動作します。データ型はSwiftクラスとしてインポートされ、それらに関連するグローバル関数はそれらのクラスのメソッドおよびプロパティとしてインポートされます。定数のセットなどのいくつかの関連するものは、必要に応じてサブタイプになります。
Xcode 8 / Swift 3ベータでは、Appleはこの機能を(他のいくつかと同様に)適用して、Dispatchフレームワークをより迅速にしています。(そしてCore Graphicsも。)あなたがSwiftオープンソースの取り組みを続けてきたなら、これはニュースではありませんが、Xcodeの一部となったのは今回が初めてです。
プロジェクトをSwift 3に移動する最初のステップは、Xcode 8でプロジェクトを開き、メニューで[編集]> [変換]> [現在のSwift構文... ]を選択することです。これは、名前を変更したすべてのAPIとその他の変更に必要なすべての変更を(レビューと承認と共に)一度に適用します。(多くの場合、コード行はこれらの変更の1つ以上の影響を受けます。そのため、エラー修正に応答することは、個別にすべてを正しく処理できない可能性があります。)
その結果、作業をバックグラウンドに跳ね返して戻すための一般的なパターンは次のようになります。
// 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_PRIORITY
定数の代わりに使用していることに注意してください。Quality of Service(QoS)指定子はOS X 10.10 / iOS 8.0で導入され、システムが作業に優先順位を付け、古い優先度指定子を非推奨にする明確な方法を提供します。詳細については、バックグラウンド作業とエネルギー効率に関する Appleのドキュメントを参照してください。
ちなみに、作業を整理するために独自のキューを保持している場合、取得する方法は次のようになります(これDispatchQueueAttributes
はOptionSet
なので、コレクションスタイルのリテラルを使用してオプションを組み合わせます)。
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バージョンのドキュメントコンテンツはまだ移動されていないようです。)
その他のヒントについては、移行ガイドをご覧ください。