通过Swift closure让GCD调用变得更优雅

刚才看到一个博客
讲了开源的应用Swiflytics制作的一些内容,其中对于dispatch_async的处理很漂亮,原本我们肯定这样写

1
2
3
dispatch_async(dispatch_get_main_queue(), { _ in
// blah blah …
})

作者通过写接一个closure的函数实现了像代码块儿一样的优雅调用

1
2
3
4
5
6
7
8
func onMainThread(closure: () -> ()) {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
closure()
})
}

// 调用方
onMainThread { completion(onlineUsers) }

因为swift里面最后一个参数如果是closure的话可以直接通过大括号包裹起来这么写所以使上面的写法成为可能
顺便说下完整调用应该是这样的

1
2
3
onMainThread(closure: { () -> () in
completion(onlineUsers)
})

但是因为swift编译器很聪明所以可以省略成这样子。

在知道了这些以后,

1
2
3
4
5
6
7
8
9
10
func onBackgroundThred(closure: () -> ()) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { () -> ()) in {
closure()
}
}

onBackgroundThred {
sleep(10)
onMainThread { /* blah blah … */ }
}

嗯,确实漂亮好多