如何在NSArray对象中搜索NSString属性与另一组NSString属性匹配的对象?

时间:2014-07-29 14:42:30

标签: objective-c cocoa-touch core-data nsstring nsarray

所以在这里我从核心数据中获取所有对象并存储在NSArray中:

// Set up fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"BagItem"];

// Get fetched objects and store in NSArray
NSArray *fetchedObjects = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];

每个对象都有title属性,size属性和color属性。我有一个UIPickerView,从这里我可以选择特定项目的大小和颜色,然后点击应用以使用核心数据存储它们。

我想防止重复的行。例如:

Leather Coat, Blue, X-Large (Quantity 5)

Leather Coat, Blue, X-Large (Quantity 1)

我想避免这种情况,而是检测到具有特定标题,大小和颜色的对象已经存在。如果是的话,我想更新现有行的数量标签。

到目前为止,我已经完成了一半。我有一个详细信息视图控制器,可以在切换到显示对象的tableView之前检测到这一点并完成魔术。然而,在tableView上,我允许客户编辑颜色和大小。这使客户有机会将对象/项目的属性更新为他们希望的任何颜色和大小,即使存在具有相同颜色和大小的现有相同项目。

我试图阻止这一点。我想做的是:

  1. 搜索数组中包含我想要修改的当前项目的标题,大小和颜色的项目。

  2. 更新匹配项目的数量标签。

  3. 然后删除不再需要的项目行。*

  4. 我只是觉得最好解释一下我的目的。

    所以我需要知道的是如何在我的NSArray中搜索其NSString属性与另一组NSStrings匹配的项目。

    感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您可以使用NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@ AND size == %@ AND colour == %@", bagItem.title, bagItem.size, bagItem.color];
NSArray *filtered = [arrayOfItems filteredArrayUsingPredicate:predicate];

您可以通过KVC获得总和,例如:

NSNumber *total = [filtered valueForKeyPath:@"@sum.quantity"];

然后,您可以创建一个新的BagItem实例,其标题颜色和大小以及新的数量值具有相同的值。 您可以根据自己的设置更新模型并重新加载表格。

相关问题