如何在 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
以确认捕获(与闭包表达式相同)
当然,请记住,没有什么可以阻止您使用显式闭包调用 myFunc
:myFunc [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++ 上创建异步调用函数?
如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数