小编典典

苹果新的编程语言Swift如何处理块和异步请求?

swift

参见Apple在Swift上的网站页面:https :
//developer.apple.com/swift/

Swift中是否有像Objective-C一样的块?如何创建和调用它们?

如何在Swift中执行异步请求?

快速创建与块相关的内存泄漏容易吗?如果是,您将如何避免它们?


阅读 265

收藏
2020-07-07

共1个答案

小编典典

(Objective-)C块的Swift等效项称为闭包。《The Swift Programming
Language》一书中有一整章关于它们的内容。

根据使用闭包的上下文,可以使用非常简洁的语法声明/使用它。例如,可以采用如下方法(success: Bool, error: NSError) - > Void调用采用签名的完成处理程序的方法:

someMethod(otherParameters: otherValues, completionHandler:{ success, error in
    if !success { NSLog("I am a leaf on the wind: %@", error) }
})

在闭包本质上提供流控制的情况下,还有一种尾随的闭包语法可以很好地理解。而且,您可以在想要简短的时候删除参数名称(以牺牲可读性为代价,但是在某些明显的情况下(如下面所示)是可以的)。通常,return语句也是隐式的。

myArray.sort { $0 < $1 }
let squares = myArray.map { value in
    value * 2
}

Swift本身没有异步请求的任何内容,因此您可以使用现有的API。不过,您可以使用结尾的闭包语法:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
    // do some async stuff
    NSOperationQueue.mainQueue().addOperationWithBlock {
        // do some main thread stuff stuff
    }
}

在大多数情况下,您无需担心像使用ObjC块那样使用Swift闭包创建参考循环。简而言之,捕获语义足够类似于大多数事物所需的“工作方式”,但又有足够的区别,以至于块/闭包使用的通用模式(例如,分派到后台/主线程并引用self的)。属性)不会引起循环。

循环仍然是可能的,但是有一个解决方案。这个答案已经有点长了,因此请查看文档中的“
强大的闭包参考周期”以获取完整的解释。

2020-07-07