[解決済み] Swift 3でdispatch_onceはどうなる?
質問
さて、そこで私は新しい
SwiftyディスパッチAPI
Xcode 8に搭載されました。を使って楽しんでいます。
DispatchQueue.main.async
をブラウズしています。
Dispatch
モジュールを使って、新しいAPIをすべて見つけることができます。
しかし、私はまた
dispatch_once
シングルトンの作成やワンタイムセットアップのようなものが(マルチスレッド環境であっても)複数回実行されないようにするため...そして
dispatch_once
は、新しい Dispatch モジュールにはどこにもないのですか?
static var token: dispatch_once_t = 0
func whatDoYouHear() {
print("All of this has happened before, and all of it will happen again.")
dispatch_once(&token) {
print("Except this part.")
}
}
解決方法は?
Swift 1.x以降、Swiftは
dispatch_once
舞台裏
を使用して、グローバル変数と静的プロパティのスレッドセーフな遅延初期化を実行します。
そのため
static var
は、すでに
dispatch_once
のトークンとして使用するのは、ちょっと変ですね。
dispatch_once
. 実際、安全な方法はありません。
dispatch_once
このような再帰性を排除するために、廃止されたのです。その代わり、その上に構築された言語機能を使うだけでいいんです。
// global constant: SomeClass initializer gets called lazily, only on first use
let foo = SomeClass()
// global var, same thing happens here
// even though the "initializer" is an immediately invoked closure
var bar: SomeClass = {
let b = SomeClass()
b.someProperty = "whatever"
b.doSomeStuff()
return b
}()
// ditto for static properties in classes/structures/enums
class MyClass {
static let singleton = MyClass()
init() {
print("foo")
}
}
ということで、これまで使っていた
dispatch_once
一回限りの
初期化
その値をグローバル変数や静的プロパティとして初期化すればよいのです。
しかし、もしあなたが
dispatch_once
必ずしも結果が出るとは限らない仕事をするために?グローバル変数や静的プロパティを使っても、そのようなことは可能です。
Void
:
let justAOneTimeThing: () = {
print("Not coming back here.")
}()
また、グローバル変数や静的プロパティにアクセスして一回限りの作業を行うのが気に入らない場合、例えば、クライアントがあなたのライブラリを操作する前に "initialize me" 関数を呼び出したい場合、そのアクセスを関数でラップすれば良いのです。
func doTheOneTimeThing() {
justAOneTimeThing
}
をご覧ください。 移行ガイド をご覧ください。
関連
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] Swift 3、Swift 4、それ以降で dispatch_sync, dispatch_async, dispatch_after などはどうすればいいですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Swiftで#pragmaマーク?
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] Swiftの@selector()?
-
[解決済み] Swiftでdispatch_onceのシングルトンモデルを使う
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] Swift 3でディスパッチキューを作成する方法
-
[解決済み] Objective-CでGCDのdispatch_onceを使用してシングルトンを作成する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Swift 5でXOR?
-
[解決済み] swift 3 エラー。引数ラベル '(_:)' は利用可能なオーバーロードに一致しません。
-
[解決済み] このコンテキストで型検索を行う場合、「メソッド」は曖昧である、Alamofireのエラー
-
[解決済み] Swift 3でdispatch_onceはどうなる?
-
[解決済み] Swift 3、Swift 4、それ以降で dispatch_sync, dispatch_async, dispatch_after などはどうすればいいですか?
-
[解決済み] タイプ 'StorageMetadata' の値には、メンバー 'downloadURL' がありません。
-
[解決済み] 使用しているSwiftのバージョンを確認するにはどうすればよいですか?
-
[解決済み】Xcode 6 Beta 4でアプリを実行すると「表示権限がないため、ファイル "MyApp.app" を開くことができません。
-
[解決済み】swift 4でenumをDecodableにするにはどうすればいいですか?
-
[解決済み】Swiftで列挙型の値の名前を取得する方法は?