Iphone 如何比较两组数据?

Iphone 如何比较两组数据?,iphone,ios,objective-c,alassetslibrary,Iphone,Ios,Objective C,Alassetslibrary,我在比较两组对象时遇到一些问题。我有两个NSMutableArray:SelectedImage和mutableAssets。我把所有的东西都放在那里。但当我想比较这些资产时,它不适用于isEqual或containsObject方法,只有当我通过它们的url进行比较时,它才起作用: ALAsset *asset1 = [self.mutableAssets objectAtIndex:0]; ALAsset *asset2 = [self.selectedIma

我在比较两组对象时遇到一些问题。我有两个NSMutableArray:SelectedImage和mutableAssets。我把所有的东西都放在那里。但当我想比较这些资产时,它不适用于isEqual或containsObject方法,只有当我通过它们的url进行比较时,它才起作用:

        ALAsset *asset1 = [self.mutableAssets objectAtIndex:0];
        ALAsset *asset2 = [self.selectedImages objectAtIndex:0];

        NSLog(@"%@", asset1);
        NSLog(@"%@", asset2);

        if([self.selectedImages containsObject:[self.mutableAssets objectAtIndex:0]]) {
            NSLog(@"the same1");
        }
        if([asset1 isEqual:asset2]) {
            NSLog(@"the sames2");
        }
        if([asset1.defaultRepresentation.url isEqual:asset2.defaultRepresentation.url]) {
            NSLog(@"the same3");
        }
仅给出这一行:

ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=E8947286-22E2-42E4-A904-14D940A387B3&ext=JPG
ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=E8947286-22E2-42E4-A904-14D940A387B3&ext=JPG
the same3

为什么会发生这种情况?

似乎资产没有实现平等:

但是我不会检查defaultRep的URL。。。两个不同的资产可能在某种程度上具有相同的defaultRep

我会选择iOS 6+的AlasSetPropertyAsetUrl或iOS 4和5的AlasSetPropertyUrl

--你甚至可以把它归入一个类别

@interface ALAsset (isEqual)
- (NSURL*)defaultURL;
@end

@implementation ALAsset (isEqual)

- (NSURL*)defaultURL {
     if([[[UIDevice currentDevice] systemVersion] floatValue]>=6.0)
     {
          return [self valueForKey: ALAssetPropertyAssetURL];
     }
     else
     {
           return self.defaultRepresentation.url;
     }
}
- (BOOL)isEqual:(id)obj {
    if(![obj isKindOfClass:[ALAsset class]]) 
        return NO;

    NSURL *u1 = [self defaultURL];
    NSURL *u2 = [obj defaultURL];

    return ([u1 isEqual:u2]);
}

对于iOS 4、5、6及更高版本

来说,资产似乎没有实现isEqual:

但是我不会检查defaultRep的URL。。。两个不同的资产可能在某种程度上具有相同的defaultRep

我会选择iOS 6+的AlasSetPropertyAsetUrl或iOS 4和5的AlasSetPropertyUrl

--你甚至可以把它归入一个类别

@interface ALAsset (isEqual)
- (NSURL*)defaultURL;
@end

@implementation ALAsset (isEqual)

- (NSURL*)defaultURL {
     if([[[UIDevice currentDevice] systemVersion] floatValue]>=6.0)
     {
          return [self valueForKey: ALAssetPropertyAssetURL];
     }
     else
     {
           return self.defaultRepresentation.url;
     }
}
- (BOOL)isEqual:(id)obj {
    if(![obj isKindOfClass:[ALAsset class]]) 
        return NO;

    NSURL *u1 = [self defaultURL];
    NSURL *u2 = [obj defaultURL];

    return ([u1 isEqual:u2]);
}
对于iOS 4、5、6及以上版本

背景 containsObject:is通过向数组的每个对象发送一条isEqual:消息并将一个对象作为参数传递给每个isEqual:消息来确定数组中是否存在一个对象

isEqual:检查两个对象是否相同。如果两个对象相等,则它们必须具有相同的哈希值。哈希是指哈希表结构中的表地址

所以,如果不包含对象也不相等。如果您希望设置覆盖isEqual,则派生结果

NSURL,isEqual是两个NSURL被认为相等,当且仅当它们为baseURL和relativeString返回相同的值时。

Background
if([[[asset1 defaultRepresentation].url absoluteString] isEqualToString:[[asset2 defaultRepresentation].url absoluteString]])
{
}
else
{
}
containsObject:is通过向数组的每个对象发送一条isEqual:消息并将一个对象作为参数传递给每个isEqual:消息来确定数组中是否存在一个对象

isEqual:检查两个对象是否相同。如果两个对象相等,则它们必须具有相同的哈希值。哈希是指哈希表结构中的表地址

所以,如果不包含对象也不相等。如果您希望设置覆盖isEqual,则派生结果


NSURL,isEqual是两个NSURL被认为是相等的,当且仅当它们为baseURL和relativeString返回相同的值时。

感谢您的回答,它帮助了我!编辑建议的valueForProperty。可能比我经常使用的valueForKey好一点^^^我喜欢KVCIt应该注意的是,这只适用于iOS 6+。由于AlasSetPropertyAsetUrl未在较低版本中实现。您如何看待文档中的此注释:库更改通知使用此URL来标识资产和资产组。只有ALAssetRepresentation和AlassetGroup类支持此属性。从您的代码:-BOOLisEqual:idobj{if![obj isKindOfClass:[ALAsset class]]返回否;NSURL*u1=[self-defaultURL];NSURL*u2=[obj-defaultURL];返回[u1 isEqual:u2];}mainURL->defaultURL谢谢您的回答,它帮助了我!编辑建议的valueForProperty。可能比我经常使用的valueForKey好一点^^^我喜欢KVCIt应该注意的是,这只适用于iOS 6+。由于AlasSetPropertyAsetUrl未在较低版本中实现。您如何看待文档中的此注释:库更改通知使用此URL来标识资产和资产组。只有ALAssetRepresentation和AlasSetGroup类支持此属性。从您的代码:-BOOLisEqual:idobj{if![obj isKindOfClass:[ALAsset类]]返回否;NSURL*u1=[self-defaultURL];NSURL*u2=[obj-defaultURL];返回[u1 isEqual:u2];}mainURL->defaultURL
if([[[asset1 defaultRepresentation].url absoluteString] isEqualToString:[[asset2 defaultRepresentation].url absoluteString]])
{
}
else
{
}