Iphone 如何比较两组数据?
我在比较两组对象时遇到一些问题。我有两个NSMutableArray:SelectedImage和mutableAssets。我把所有的东西都放在那里。但当我想比较这些资产时,它不适用于isEqual或containsObject方法,只有当我通过它们的url进行比较时,它才起作用: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
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
{
}