1

我在比较两个 ALAssets 对象时遇到了一些麻烦。我有两个 NSMutableArray:selectedImages 和 mutableAssets。我在那里存储 ALAssets 对象。但是当我想比较这些资产时,它不适用于 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

为什么会发生?

4

3 回答 3

9

似乎资产没有实现isEqual:

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

我会选择ALAssetPropertyAssetURL for iOS 6+ALAssetPropertyURLs for ios4&5

--- 你甚至可以把它包装在一个类别中!

@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 及更高版本

于 2013-03-11T14:11:55.333 回答
3

背景

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

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


所以,如果不是 containsObject 也不是 isEqual。如果您想要您的 ALAsset 覆盖,请导出结果isEqual

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

于 2013-03-11T14:17:48.803 回答
1
if([[[asset1 defaultRepresentation].url absoluteString] isEqualToString:[[asset2 defaultRepresentation].url absoluteString]])
{
}
else
{
}
于 2014-01-13T11:07:17.470 回答