gpt4 book ai didi

ios - Swift - 如何在释放调用者时从数组中正确删除 block ?

转载 作者:行者123 更新时间:2023-11-28 15:20:13 25 4
gpt4 key购买 nike

我有一个“updateBlocks”数组(闭包),我在单例类中使用它来在数据更新时通知任何观察者(UIViewControllers 等)。 p>

我想知道移除观察者的最佳方法是什么,以便在观察者被释放(或不再需要更新)时不执行观察者。

这是我当前的设置:

MySingleton 类

var updateBlock: (() -> ())? {
didSet {
self.updateBlocks.append(updateBlock!)
self.updateBlock!() // Call immediately to give initial data
}
}
var updateBlocks = [() -> ()]()

func executeUpdateBlocks() {
for block in updateBlocks {
block()
}
}

MyObserver 类

MySingleton.shared.updateBlock = {
...handle updated data...
}

MySingleton.shared.updateBlock = nil // How to properly remove???

最佳答案

你的单例设计有一些问题。

updateBlock 成为 didSet 方法将 block 附加到您的 updateBlocks 数组的变量是糟糕的设计。

我建议摆脱 updateBlock var,而是定义一个 addUpdateBlock 方法和一个 removeAllUpdateBlocks 方法:

func addUpdateBlock(_ block () -> ()) {
updateBlocks.append(block)
}

func removeAllUpdateBlocks() {
updateBlocks.removeAll()
}
func executeUpdateBlocks() {
for block in updateBlocks {
block()
}

如果你想删除单个 block ,那么你需要一些方法来跟踪它们。正如 rmaddy 所说,每个 block 都需要某种 ID。您可以将 block 的容器重构为字典并使用顺序整数键。当您添加新 block 时,您的 addBlock 函数可以返回 key :

var updateBlocks = [Int: () -> ()]()
var nextBlockID: Int = 0

func addUpdateBlock(_ block () -> ()) -> Int {
updateBlocks[nextBlockID] = block
let result = nextBlockID
nextBlockID += 1

//Return the block ID of the newly added block
return result
}

func removeAllUpdateBlocks() {
updateBlocks.removeAll()
}

func removeBlock(id: Int) -> Bool {
if updateBlocks[id] == nil {
return false
} else {
updateBlocks[id] = nil
return true
}

func executeUpdateBlocks() {
for (_, block) in updateBlocks {
block()
}

如果您将 block 保存在字典中,那么它们将不会以任何定义的顺序执行。

关于ios - Swift - 如何在释放调用者时从数组中正确删除 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46136732/

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