比较来自 2 个数组 (iOS) 的自定义对象



上下文:

  • 开发社交应用。
  • 我有两个包含相同对象类型的数组(称为"友谊")。
  • 一个来自本地数据库(localArray),另一个来自服务器(onlineArray)
  • 在线的始终是最新的,本地的可能略有不同或完全相同。

我需要比较它们。

问题 :

  • 每个友谊都有不同的属性值(为了知道,有分数、名字等)。
  • 这两个数组没有专门包含相同数量的友谊(如果用户在两次更新之间删除了它)
  • 它们的顺序不同。 本地数组中的第一个对象可能具有
  • ID X,而另一个对象中的第一个对象可能具有 Y。

目标 :

从意义上讲,我只想用新内容更新我的本地数据库。它是一个SQLite数据库。我只想更新更改的字段。假设友谊#147有一个更新的分数,我只是更新了相应的对象147,我很好。但是知道发生了什么变化会阻止我。

现状:

现在,我只是总是删除它并使用新内容重新创建它,正如您现在可能会尖叫的那样,这是非常欠优的。这是我的代码(带注释)

+ (void)compareFriendshipsFromDb:(NSMutableArray*)friendshipsFromDb andInsert:(NSMutableArray*)friendshipsOnline{
    BOOL update = NO;  //It tells us if there is new stuff
    NSUInteger x = 0;  //It helps us compare later.
    if ([friendshipsFromDb count] != [friendshipsOnline count]){
        update = YES;  //The count is different, there MUST be something different, we update.
    }
    else{
        x = [friendshipsOnline count];  //same count, but not specifically identical.
        // i'm saving that count in 'x' because its the up-to-date count.
    }
    if (x > 0 && update == NO){  //This means that the count was identical and that there were friendships to update
        for(int i = 0; i < x ; i ++){
            //TODO: Compare with PREDICATES ? I read online that it's very powerful/optimal
            //This is how I compare right now. It's always updating right now...
            if (![friendshipsFromDb containsObject:[friendshipsOnline objectAtIndex:i]]){
                update = YES;
                break;
            }
        }
    }
    // Count was at zero (no friendships online) and none were found in DB. Pretty much alone.
    if (x == 0 && update == NO){
        DLog(@"There are no friends to compare");
    }
    //This is my update process, doesn't really matter.
    if (update){
        [DatabaseManager dropAndRecreateTable:@"friendships"];
        [DatabaseManager insertFriendships:friendshipsOnline];
    }
//And this calls the end of this part of the update, doesn't really matter either.
//I left these just so you have the complete process.
    else {
        [[NSNotificationCenter defaultCenter]postNotificationName:NOTIF_FRIENDSHIPS_DONE object:self];
        [[NSNotificationCenter defaultCenter]postNotificationName:NOTIF_HOME_RELOAD object:self];
    }
}

另外,我觉得将每个对象与其他对象(两个 for 循环)进行比较完全是矫枉过正,考虑到: - 我有多个属性要比较 - 大多数比较都是无用的,因为我不需要将友谊 X 与友谊 Y 进行比较。我需要将其与新版本的友谊X进行比较。

好了,这就是我现在的全部内容,但请务必在评论中提问。对于一个有经验的程序员来说,这看起来相当容易,但我不知道我如何才能在这里取得成功。我的残酷方法有效,但充满了不必要的过程。

我都听见了!

编辑 : 相关问题 :

我总是会在该特定表中处理大约 10 到 50 个条目。保持原样,还是将所有内容与 ifs 中的内部 forloop 进行比较,并进行唯一的数据库调用(但可能连续 15 次)更有效?连续 15 次打开-更新-关闭 db 还是每次(但一次)残酷地删除并作为数组插入所有内容会更重 CPU ?

考虑你想比较 产品对象数组

产品

@interface Prodcut : NSObject
@property NSString *name;
@property NSString *firstName;
-(BOOL)isEqual:(Prodcut *)object;
@end

产品.m

#import "Prodcut.h"
@implementation Prodcut
-(BOOL)isEqual:(Prodcut *)object{
    int i = 0;
    if ([self.name isEqual:object.name]) {
        i++;
        if ([self.firstName isEqualToString:object.firstName]) {
            i++;
        }
    }
    if (i == 2) {
        return YES;
    }
    else return NO;
}
@end

压缩逻辑

Prodcut *prod1 = [[Prodcut alloc] init];
prod1.name = @"name";
prod1.firstName = @"fn1";
Prodcut *prod2 = [[Prodcut alloc] init];
prod2.name = @"name";
prod2.firstName = @"fn2";
Prodcut *prod3 = [[Prodcut alloc] init];
prod3.name = @"name";
prod3.firstName = @"fn1";
Prodcut *prod4 = [[Prodcut alloc] init];
prod4.name = @"name";
prod4.firstName = @"fn2";
NSArray *array1 = [NSArray arrayWithObjects:prod1,prod2,nil];
NSArray *array2 = [NSArray arrayWithObjects:prod3,prod4,nil];
int i=0;
if (array1.count == array2.count) {
    for (Prodcut *pro in array1 ) {      
        for (Prodcut *innerPro in array2) {
            if ([pro isEqual:innerPro]) {
                i++;
                break;
            }
        }
    }
    if (i == array1.count) {
        NSLog(@"same");
    }
    else{
        NSLog(@"Not Same");
    }
}
else{
    NSLog(@"Not same");
}

相关内容

  • 没有找到相关文章

最新更新