SwiftでもObjective-Cと同様に、普通にdispatch_async
関数などが用意されており、GCDが利用できるようなのですが、
「大体バックグランドスレッドとメインスレッドを非同期で呼ぶぐらいしかやらないっしょ??」
...という事で、ちょっとした関数を書いてみました。
用意するもの
func dispatch_async_main(block: () -> ()) {
dispatch_async(dispatch_get_main_queue(), block)
}
func dispatch_async_global(block: () -> ()) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)
}
使い方
func onTest(sender: AnyObject) {
// HUDとか出す
// showHUD()
dispatch_async_global { // ここからバックグラウンドスレッド
// なんか重い処理
var res = 0
for i in 1...10000 {
res += i
}
dispatch_async_main { // ここからメインスレッド
// HUD消したり
// hideHUD()
// 結果をUIへ表示したり
self.label.text = "res=\(res)"
}
}
}
ちょっとだけキーを打つ回数が減るだけなので、あまり恩恵は無いかもしれませんが、今まで#define
を駆使してGCDを利用されていた方なんかはこんなやり方がしっくり来るのではないかと思います。
(保守する人が読みやすくなるかは怪しいですが。)