gpt4 book ai didi

ios - iOS快速枚举时需要修改预加载数据的NSMutableArray

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

我有一个保存对象列表的 NSMutableArray。我想要做的是遍历这个对象列表,并找到我要插入的匹配对象。找到匹配的对象后,我只想用我要插入的对象替换当前列表中的对象。我正在尝试使用快速枚举来做到这一点:

TestResult *result = [[TestResult alloc] init];
[result setName:name];
[result setScore:score];
[result setDateStamp:date];


for (TestResult *checkTest in [DataModel sharedInstance].testResultList) {

NSInteger indx = [[DataModel sharedInstance].testResultList indexOfObjectPassingTest:^BOOL(TestResult *obj, NSUInteger idx, BOOL *stop) {
return [obj.name isEqualToString:name];
}];

if (indx != NSNotFound) {

[[DataModel sharedInstance].testResultList replaceObjectAtIndex:indx withObject:result];

}

}

不幸的是,当我运行上面的代码时,出现了以下错误:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x9624820> was mutated while being enumerated.'

谁能看出我做错了什么,如何解决这个问题,同时实现我上面描述的功能?

最佳答案

首先,崩溃是不言自明的。你实际上是在改变(也就是替换数组中的对象),而快速枚举仍在进行中,这是不允许的。

如果按照您的设计进行,解决方案是实际捕获对象的索引,打破快速枚举并替换快速枚举之外的对象。

然而,你所做的是不正确的。indexOfObjectPassingTest 的使用方法是这样的:

NSInteger indx = [[DataModel sharedInstance].testResultList indexOfObjectPassingTest:^BOOL(TestResult *obj, NSUInteger idx, BOOL *stop) {
return [obj.name isEqualToString:name];
}];

if (indx != NSNotFound) {

[[DataModel sharedInstance].testResultList replaceObjectAtIndex:indx withObject:result];

}

您不需要手动枚举数组的所有元素。该函数在内部为您执行此操作。

关于ios - iOS快速枚举时需要修改预加载数据的NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940620/

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