仅在不存在的情况下如何将对象添加到数组

时间:2019-12-26 21:48:27

标签: ios arrays objective-c

我得到了一个对象数组,例如:Obj1 = {idUser:1,lat:19.0000,lng:-99.0000,active:true}。这是为了监视某些用户,因此,如果一个用户离开,它将其属性活动值从true更改为false,而我必须将其从数组中删除,或者如果某个用户更改其位置,则仅属性坐标值会更改。至此,我已经实现了这一点,那就是当未注册的用户到达时,我需要将其添加到数组中,但是它会将用户添加的次数是idUser与现有用户不匹配的次数,因此我只需要添加一次。

这是我使用的代码示例:

    User *u3 = [[User alloc] initWithIdUser:@3 lat:19.417210 lng:-99.163552 active:@"true"];

for (User *u in users) { 
    if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"false"]) {
        NSLog(@"User leaves");
        [users removeObject:u];
    } else if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"true"]) {
        NSLog(@"User changed location");
        [u setCoordinate:u3.coordinate];
    } else if (![u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"true"]) {
        NSLog(@"New user...");
        [users arrayByAddingObject:u3];
    }
}

3 个答案:

答案 0 :(得分:2)

希望它会对您有所帮助。

// array of all active users id
NSArray* idUsersArray =  [users valueForKey:@"idUser"];
// check if user already exist or not
if ([idUsersArray containsObject:u3.idUser]) {

    // get index of user
    NSUInteger index = [idUsersArray indexOfObject:u3.idUser];

    if ([u3.active isEqualToString:@"false"]) {
        [users removeObjectAtIndex:index];
         NSLog(@"User leaves");
    } else {
        User* u = [users objectAtIndex:index];
        [u setCoordinate:u3.coordinate];
        NSLog(@"User changed location");
    }
} else {
    // add user into users array
    [users arrayByAddingObject:u3];
    NSLog(@"New user...");
}

答案 1 :(得分:1)

很显然,新数据将被添加很多次,因为那是您编写的代码试图执行的操作。您可能还会遇到问题,因为在运行快速迭代器时不应修改数组。

NSDictionary是一个更好的数据结构。您可能希望将NSInteger和BOOL用作“ idUser”和“ active”成员。

答案 2 :(得分:-1)

您需要对照另一个循环中的所有用户检查该用户。创建另一个功能

-(BOOL)canAddNewUser:(User*)user {
  for (User *u in users) { 
    if ((u.idUser isEqualToValue:user.idUser)&&([user.active isEqualToString:@"true"])) {
      return YES;
    }
  }
  return NO;
}

然后您的代码变为:

User *u3 = [[User alloc] initWithIdUser:@3 lat:19.417210 lng:-99.163552 active:@"true"];

for (User *u in users) { 
    if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"false"]) {
        NSLog(@"User leaves");
        [users removeObject:u];
    } else if ([u3.idUser isEqualToValue:u.idUser] && [u3.active isEqualToString:@"true"]) {
        NSLog(@"User changed location");
        [u setCoordinate:u3.coordinate];
    } 
}

if ([self canAddNewUser:u3]) {
    NSLog(@"New user...");
    [users arrayByAddingObject:u3];
}