gpt4 book ai didi

iphone - 使用快速枚举的监听器模式问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:07 25 4
gpt4 key购买 nike

嘿,现在我已经实现了自己的监听器模式。我将使用快速枚举向听众发送更新。代码看起来像这样

- (void) updateListeners {
for (id<AProtocol>listener in _listeners)
{
[listener update];
}

在监听器中,我实现了 AProtocol 的方法,即更新。假设 _listeners 中有 n 个对象,并且有 m 个监听器,使得 m < n 想在调用监听器的更新方法时将其从监听器中自行删除。这样做的问题是,当快速枚举正在进行时我无法删除,我会得到一个错误。为了使监听器更加动态,以便我们可以在调用更新方法时从 _listeners 中删除监听器,解决方案是什么?(我不想使用 NSNotificationCenter)

最佳答案

听起来您现在拥有的是监听器本身决定是否应将其删除,并自行删除。这是有问题的,因为(a)正如你所说,它破坏了你的枚举,但是(b)因为它是一个棘手的抽象——如果运行“更新”的对象不直接控制监听器列表中的所有权,你的设计模式可能无论如何都会遇到问题。我可能建议您像这样重新定义更新监听器:

- (BOOL)update

并返回一个 BOOL 指示是否应删除监听器(或保留,具体取决于您的语义)。然后你可以这样写循环:

NSMutableSet * listenersToBeRemoved = [NSMutableSet set];
for (id<AProtocol> listener in _listeners) {
BOOL shouldRemove = [listener update];
if (shouldRemove) {
[listenersToBeRemoved addObject:listener];
}
}
// Do this if _listeners is a Set, or whatever the equivalent is.
[_listeners minusSet:listenersToBeRemoved];

正如其他人所建议的那样,如果您确实希望允许监听器在更新过程中删除自己,只需遍历集合的本地副本而不是集合本身就足够简单了。其语法取决于 _listeners 是数组、集合还是其他内容,但请参阅其他答案或文档。

关于iphone - 使用快速枚举的监听器模式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3618802/

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