我有一个异步处理的函数:
func something(completion: [Something] -> Void) {
dispatch_async(queue) {
...
dispatch_async(dispatch_get_main_queue()) {
completion(something)
}
}
}
我认为使用defer
来保证每次调用completion
都是明智的,所以我尝试了这个:
func something(completion: [Something] -> Void) {
dispatch_async(queue) {
...
defer {
dispatch_async(dispatch_get_main_queue()) {
completion(something)
}
}
}
}
运作良好。然后我尝试在始终失败的异步调度中使用guard
语句,以查看是否将激活defer
。它没有:
func something(completion: [Something] -> Void) {
dispatch_async(queue) {
...
guard let shouldFail = ... else { return }
defer {
dispatch_async(dispatch_get_main_queue()) {
completion(something)
}
}
}
}
不会调用 defer
。为什么呢?
答案 0 :(得分:1)
因为您在返回后使用defer
。编译器不知道您指定了defer
指令(因为它已经返回并且在该点没有看到任何延迟指令,因此下一行不会被触发)。如果你在守卫之前移动defer {}
,那么它就会被召唤。
答案 1 :(得分:1)
guard
之前, defer
将返回。尝试相反:
func something(completion: [Something] -> Void) {
dispatch_async(queue) {
...
defer {
dispatch_async(dispatch_get_main_queue()) {
completion(something)
}
}
guard let shouldFail = ... else { return }
}
}