1

2 つの ALAssets オブジェクトの比較に問題があります。selectedImages と mutableAssets の 2 つの NSMutableArray があります。そこに 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は確認しません...2つの異なるアセットが同じ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]);
}

iOS4および5および6以降の場合

于 2013-03-11T14:11:55.333 に答える
3

バックグラウンド

containsObject:is は、配列の各オブジェクトに isEqual: メッセージを送信する (および anObject をパラメーターとして各 isEqual: メッセージに渡す) ことによって、配列内に anObject が存在するかどうかを判別します。

isEqual:2 つのオブジェクトが同じかどうかを調べます。2 つのオブジェクトが等しい場合、それらは同じhash値を持つ必要があります。hashハッシュテーブル構造のテーブルアドレスを意味します。


そのため、containsObject がなければ isEqual にもなりません。ALAsset override が必要な場合は、結果を導き出しますisEqual

NSURLisEqualは、baseURL と relativeString の両方に対して同じ値を返す場合にのみ、2 つの 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 に答える