意外的延迟行为

时间:2015-12-07 21:56:24

标签: swift swift2

我有一个异步处理的函数:

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。为什么呢?

2 个答案:

答案 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 }
  }
}