gpt4 book ai didi

objective-c - 如何解决 “Collection was mutated while being enumerated”,@synrchonized,mutableCopy或其他问题?

转载 作者:行者123 更新时间:2023-12-03 12:59:54 24 4
gpt4 key购买 nike

在Crashlytics中,我看到我的用户很少遇到崩溃。令人反感的代码看起来像这样...

- (void)updateIsAnsweredField:(NSArray *)moduleItemsList
{
if (moduleItemsList && self.answeredItems && self.answeredItems.count > 0) {
for (ModuleItem * item in moduleItemsList) { // "Collection was mutated while being enumerated"
if ([item isKindOfClass:[ModuleItem class]] && [item shouldCheckIfAnswered]) {
item.answered = [self isAnsweredItem:item.moduleID];
}
}
}
}

在上面的代码片段的注释中可以看到Crashlytics给出的错误。

我认为有几种方法可以解决此问题。

1)将所有内容包装在@synchronized(moduleItemsList){}中。这是解决的理想方法吗?我听说@synchronized非常慢,并且在可能的情况下避免使用它。

2)创建一个副本la NSMutableArray *copyModuleItemsList = [moduleItemsList mutableCopy];。然后枚举。这样可以解决问题吗?我认为它将解决这个特定的问题,但是会有另一个问题,不是吗?那就是...最后,当我们将副本分配回原始la moduleItemsList = copyModuleItemsList;时,moduleItemsList可能同时已在其他线程上更改。

3)跟踪传入的 :(NSArray *)moduleItemsList到拥有它的任何人。然后覆盖getter以使用dispatch_sync,并覆盖setter以使用dispatch_barrier_async。但是,不能保证原始数组是可以覆盖getter和setter的任何类的属性。实际上,这没有任何意义,因为我们不会专门更改该数组吗?

我有点困惑。有人可以协助处理此事吗? #1是我想要的选项吗?

编辑:添加更多代码
[item shouldCheckIFAnswered]:

这仅检查ModuleItem类上存在的@property值。 if self.moduleType == ModuleTypeSuchAndSuch isAnsweredItem::
- (BOOL)isAnsweredItem:(NSString *)moduleID
{
if (!self.answeredItems) {
return NO;
}

return [self.answeredItems containsObject:moduleID];
}

最佳答案

在您的帖子中,听起来好像moduleItemsList在另一个线程中被修改了。解决此问题的“正确”方法将取决于另一个线程中的状态与该线程中的状态之间所需的关系。

如果在此代码和修改另一个线程中的集合的代码中都使用@synchronized(moduleItemsList),则在运行此代码时,它将始终具有moduleItemsList的“最新” View 。

如果将moduleItemsList复制到另一个对象,则在运行此代码时,它可能会在不再包含在answered中的项目上设置moduleItemsList值,或者可能无法在最近添加到answered的项目上设置moduleItemsList标志。

通常,@synchronized版本是获得“正确”行为的简便方法。如果您确定两个线程可能不同意moduleItemsList的当前内容并不重要,则只想使用copy即可。

I've heard @synchronized is very slow and to avoid it when possible.



一般来说,这是可怕的建议。 @synchronized速度与确保线程之间的状态一致并提供可重入锁定所需的速度一样慢。您不想随便丢掉 @synchronized,但这是在线程之间同步数据访问的一个很好的解决方案-毕竟这就是它的目的。

关于objective-c - 如何解决 “Collection was mutated while being enumerated”,@synrchonized,mutableCopy或其他问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35584021/

24 4 0