我有一个iOS应用,我将数据从服务器加载到NSArray
然后加载到UITableView
。
这很好用。但是,当用户下拉以刷新数据时,我会对我的服务器进行新的调用并再次获取数据。这个新数据包含我的本地数据已有的对象和任何新对象。
首次填充时localArray
会有对象[A,B,C,D]
。然后我添加一个新的对象服务器端并刷新iOS应用程序上的数据。
serverData
现在会有对象[A,B,C,D,E,F]
- 我需要将E,F
添加到localArray
。
我认为嵌套for循环将是答案,如下所示:
NSMutableArray *newItems = [NSMutableArray array];
for (BBItem *itemA in serverDataArray){
for (BBItem *itemB in localArray){
if (![itemA.name isEqualToString:itemb.named]){
//add to a newItems array
}
}
}
但是我最终得到的newItems数组包含了很多同一项的重复项。这里发生了什么?
答案 0 :(得分:4)
如果项目不等于newItems
中的一项,您的算法会向localArray
添加项目。因此,大多数时候你会得到很多相同的东西。
您无法在嵌套循环中添加内容。您需要浏览所有localArray
,看到该项目不存在,然后才添加它。以下是修复代码的方法:
for (BBItem *itemA in serverDataArray){
BOOL there = NO;
for (BBItem *itemB in localArray){
if ([itemA.name isEqualToString:itemb.named]){
there = YES;
break;
}
}
if (!there) {
//add to a newItems array
}
}
这是低效的,因为内部循环遍历您当前拥有的所有项目。随着本地项目数量的增加,此循环将变得越来越慢。你最好保留NSMutableSet
本地项目的名称,因为你可以在常数而不是线性的时间内检查它:
NSMutableSet *localNames = [NSMutableSet set];
for (BBItem *itemB in localArray) {
[localNames addObject:itemB.name];
}
for (BBItem *itemA in serverDataArray){
if (![localNames containsObject:itemA.name]) {
//add to a newItems array
}
}