gpt4 book ai didi

swift - 如何使用调用回调的函数制作 swift 3.0 类?

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:25 24 4
gpt4 key购买 nike

我需要一些简单的方法来制作一个我可以使用 Swift 3.0 传递和调用回调函数的类

我不喜欢使用像通知中心或选择器之类的东西,前面有#。我很挑剔,也不喜欢打那么多字。

示例:

func setCallback(function:Callback){
self.callback = function
}

func callCallback(){
self.callback()
}

最佳答案

假设您有一些复杂的任务,并且您想要提供一个在任务完成时调用的回调:

class ComplexTaskManager {
var completionHandler: (() -> Void)?

func performSomeComplexTask() {
...

// when done, call the completion handler

completionHandler?()

// if this was a one-time completion handler, you'd `nil` it; it helps protect against strong reference cycles; otherwise comment the next line

completionHandler = nil
}
}

因此,您可以像这样使用它:

let manager = ComplexTaskManager()

manager.completionHandler = {
// this is what I want to do when the task is done
}

manager.performSomeComplexTask()

现在,我想象我们正在处理一些耗时的异步任务,您希望在它完成时为其调用回调。但是还有其他类似的模式(例如,也许您正在遍历某个模型对象,并且您希望为该对象中的每个实例调用回调),但想法与上述相同。


如果你有一个强引用循环,你可以用弱引用来修复它(例如提供 [weak self][unowned self] 到闭包)。例如,假设:

class ViewController {
let manager = ComplexTaskManager()

@IBOutlet weak var statusLabel: UILabel!

override viewDidLoad() {
super.viewDidLoad()

statusLabel.text = "Starting complex task"

manager.completionHandler = { [weak self] in
self?.statusLabel.text = "Done"
}

manager.performSomeComplexTask()
}
}

但只有在存在强引用循环时才需要这样做(例如, View Controller 保持对管理器的强引用,并且由于闭包中存在 self,管理器是保持对 View Controller 的强引用)。但是,如果其中任何一个是本地引用而不是属性,则没有强引用循环可以打破。


坦率地说,对于每个任务将调用一次的闭包,更常见的模式是将其作为方法的参数提供。例如:

class ComplexTaskManager {
func performSomeComplexTask(completionHandler: () -> Void) {
...

// when done, call the completion handler

completionHandler()
}
}

因此,您可以像这样使用它:

let manager = ComplexTaskManager()

manager.performSomeComplexTask() {
// this is what I want to do when the task is done
}

这种方法的美妙之处在于它不仅更简单,而且避免了强引用循环的风险。

关于swift - 如何使用调用回调的函数制作 swift 3.0 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40625428/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com