迭代两个数组

时间:2014-08-15 12:57:13

标签: ios objective-c

我有一个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数组包含了很多同一项的重复项。这里发生了什么?

1 个答案:

答案 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
    }
}
相关问题