如何在 Swift 的异步块中使用 @autoclosure 参数?

Posted

技术标签:

【中文标题】如何在 Swift 的异步块中使用 @autoclosure 参数?【英文标题】:How to use @autoclosure parameter in async block in Swift? 【发布时间】:2015-05-21 22:34:51 【问题描述】:

我想在dispatch_async 块内调用@autoclosure 参数。

func myFunc(@autoclosure condition: () -> Bool) 
  dispatch_async(dispatch_get_main_queue()) 
    if condition() 
      println("Condition is true")
    
  

我收到以下错误。

@noescape 参数的闭包使用可能允许它逃逸。

是否可以异步调用@autoclosure 参数?

在 Xcode 6.4 (6E23) 中测试。

【问题讨论】:

【参考方案1】:

是的,只要你声明它们@autoclosure(escaping)

带有autoclosure 属性的声明也暗示noescape,除非传递了可选属性escaping

所以应该这样做:

func myFunc(@autoclosure(escaping) condition: () -> Bool) 
    dispatch_async(dispatch_get_main_queue()) 
        if condition() 
            println("Condition is true")
        
    

【讨论】:

它很好用,但是这对使用这个 api 的用户来说会不会很危险?如果它是一个闭包并且假设它是异步的,我们知道我们必须使用[weak self],但如果它是一个转义的自动关闭用户不会使用[weak self] 是的,当然。虽然如果你隐式引用self,编译器会警告你需要显式引用self以确认捕获(与闭包表达式相同) 当然,请记住,没有什么可以阻止您使用显式闭包调用 myFuncmyFunc [weak self] in self?.p ?? false 当使用短符号myFunc(true)时,编译器让我们知道自我捕获很遗憾[弱自我]是不可能的,我也无法使用myFunc [weak self] in self?.p ?? false 而必须这样做:myApiCall ( [weak self] in self?.loading = false ()),在编译时触发段错误

以上是关于如何在 Swift 的异步块中使用 @autoclosure 参数?的主要内容,如果未能解决你的问题,请参考以下文章

将块中异步接收的 JSON 对象传递给实例变量 - 在 iOS6 上使用 AFNetworking

如何使用 Combine + Swift 复制 PromiseKit 风格的链式异步流

如何使用从 Swift 代码调用的线程在 C++ 上创建异步调用函数?

内存泄漏,在do-catch块中。 iOS,Swift

如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数

Swift - 从完成块中解除视图控制器