我可以在对象的属性上使用[NSArray containsObject:]函数吗?

Tho*_*yer 1 comparison performance xcode nsarray

背景资料:

我编写了一个包含2个图库的iOS应用程序:本地图库和服务器库.当用户更新服务器库并将其合并到本地服务器库时,应用程序应该只下载新图像.

为了最大限度地减少内存消耗,我保存了图像并使用ImageEntity具有以下属性的类的实例填充数组:fileName,filePathvotingStatus.

我尝试使用以下逻辑来检查图像是否已存在:

for (ImageEntity *imageEntity in self.serverImagesArray) {
  if (![self.localImagesArray containsObject:imageEntity]){
    [self.localImagesArray  addObject:imageEntity];
  }
}
Run Code Online (Sandbox Code Playgroud)

但是因为每个实体都是一个单独的对象,所以它总是被添加.但是每个实体都有一个唯一的fileName.


问题: 我可以以某种方式扩展[NSArray containsObject:]函数以检查数组中的一个对象是否具有等于"someValue"的属性?(当我将Cocoa-Bindings与ArrayController结合使用时,我可以分配数组元素的属性 - 我想访问与此类似的属性).


我知道我可以使用比较本地数组的每个实体与服务器阵列上的每个元素.我不得不进行O(n ^ 2)比较,画廊可能包含数百张图像.

奖金问题:我是否已经在没有意识到的情况下这样做了?有没有人有关于Apple实现此功能的详细信息?是否有一些奇特的实现,或者他们只是在比较每个元素的数组上进行迭代?

Eim*_*tas 5

我这样做是valueForKey:与...结合使用containsObject:.因此,在您的情况下,您应该收集数组的所有文件名,然后检查数组是否包含您需要的特定文件名:

NSArray * fileNames = [fileEntityObjects valueForKey:@"fileName"];
BOOL contains = [fileNames containsObject:@"someFilename.jpg"];
Run Code Online (Sandbox Code Playgroud)

如果fileNamefileEntityObjects数组中每个对象的属性,这将起作用.

更新

是的,你也可以这样做NSPredicate:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF.fileName = %@", "someFileName.jpg"];
NSArray * filteredArray = [fileEntityObjects filteredArrayUsingPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

请注意,您将获得具有该文件名的对象数组,而不是布尔值.