Как сравнить два ALAsset?

У меня возникли проблемы со сравнением двух объектов 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

Почему это происходит?


person edzio27    schedule 11.03.2013    source источник


Ответы (2)


похоже, активы не реализуют isEqual:

Однако я бы не стал проверять URL-адрес defaultRep... два разных актива могут иметь один и тот же 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 и выше

person Daij-Djan    schedule 11.03.2013
comment
Спасибо за ваш ответ, он мне помог! - person edzio27; 11.03.2013
comment
предложенное редактирование valueForProperty. Может быть TAD лучше, чем valueForKey (который я всегда использую ^^ я люблю KVC) - person Daij-Djan; 28.08.2013
comment
Следует отметить, что это работает только в iOS 6+. Так как ALAssetPropertyAssetURL не реализован в младших версиях. - person Pochi; 05.09.2013
comment
Что вы думаете об этом примечании из документации: этот URL-адрес используется уведомлениями об изменении библиотеки для идентификации ресурсов и групп ресурсов. Только классы ALAssetRepresentation и ALAssetsGroup поддерживают это свойство. - person Andrew Romanov; 27.05.2015
comment
Из вашего кода: - (BOOL) isEqual: (id) obj { if (! [obj isKindOfClass: [ALAsset class]]) return NO; NSURL *u1 = [собственный URL-адрес по умолчанию]; NSURL *u2 = [URL-адрес объекта по умолчанию]; возврат ([u1 равен:u2]); } mainURL --› URL по умолчанию - person Adarsh G J; 11.11.2015
comment
Как дела :) не понимаю @IOS - person Daij-Djan; 11.11.2015
comment
mainURL не определен нигде, где r8 ... определен только URL по умолчанию .... только что я упомянул ... :) @Daij-Djan, - person Adarsh G J; 11.11.2015

Фон

containsObject: определяет, присутствует ли в массиве объект anObject, отправляя сообщение isEqual: каждому из объектов массива (и передавая anObject в качестве параметра каждому сообщению isEqual:).

isEqual: проверяет, являются ли два объекта одинаковыми. Если два объекта равны, они должны иметь одинаковое значение hash. hash означает адрес таблицы в структуре хеш-таблицы.


поэтому, если не содержитОбъект, также не равно. Получите результаты, если вы хотите, чтобы ваш ALAsset переопределял isEqual.

NSURL, isEqual — два NSURL считаются равными тогда и только тогда, когда они возвращают одинаковые значения как для baseURL, так и для relativeString.

person bitmapdata.com    schedule 11.03.2013