【发布时间】:2021-05-09 17:58:32
【问题描述】:
我有这些课程:
class Callback {
let callback: () -> Void
init(callback: @escaping () -> Void) {
self.callback = callback
}
}
class CallbackContainer {
private var callBacks = [Callback]()
func add(callback: @escaping () -> Void) -> Callback {
let cl = Callback(callback: callback)
callBacks.append(cl)
return cl
}
func callAll() {
for callback in callBacks {
callback.callback()
}
}
}
class Container {
let callbackContainer = CallbackContainer()
func executeSomeLongTasks() {
DispatchQueue.main.asyncAfter(deadline: .now() + 5) {[weak self] in
self?.callbackContainer.callAll()
}
}
}
class AViewController: UIViewController {
var callback: Callback?
let container: CallbackContainer
init(container: CallbackContainer) {
self.container = container
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
callback = container.add {
debugPrint("Called callback on A")
}
}
deinit {
debugPrint("Deinited AViewController")
}
}
我希望CallbackContainer 在没有人再调用它们时自动删除回调。例如:
let container = Container()
var aVC: AViewController? = AViewController(container: container.callbackContainer)
//on somewhere executed long task
container.executeSomeLongTasks()
aVC = nil
// should not call callback here
在这里,当aVC 被释放时——比如aVC = nil 或从导航堆栈中弹出它——那么存储在callbackContainer 中的回调(在AViewController viewDidload() 上创建)应该自动从内部数组中删除,而不需要需要手动在AViewController deinit() 上删除它。因此,不会再从CallbackContainer.callAll()调用回调
它应该像RxSwift 上的DisposeBag 一样工作。看了DisposeBag的代码,没看懂。
有人知道吗?
【问题讨论】:
标签: swift xcode memory-management callback release