我们有一个应用程序调用 SOAP Web 服务并检索一长串 XML,然后应用程序将其解析为NSArray
对象NSDictionary
。包含一个出租公寓信息列表,NSArray
每个信息都存储在一个NSDictionary
.
整个列表可能包含 10 种不同类型的 Apartments(即 2-room、3-room),我们需要根据 Room-Type 将它们拆分NSArray
成更小的 s,它在对象中具有键“roomType”。NSArray
NSDictionary
目前我们的算法是
- 用于
[NSArray valueForKeyPath:@"@distinctUnionofObjects.room-type"]
获取唯一房间类型值的列表。 - 循环遍历唯一房间类型值的列表
- 对于每个唯一的房间类型值,用于
NSPredicate
从原始列表中检索匹配的项目
我们的代码如下(为清楚起见重命名):
NSArray *arrOriginal = ... ...; // Contains the Parsed XML list
NSMutableArray *marrApartmentsByRoomType = [NSMutableArray arrayWithCapacity:10];
NSMutableArray *arrRoomTypes = [arrOriginal valueForKeyPath:@"distinctUnionOfObjects.roomType"];
for(NSString *strRoomType in arrRoomTypes) {
NSPredicate *predicateRoomType = [NSPredicate predicateWithFormat:@"roomType=%@", strRoomType];
NSArray *arrApartmentsThatMatchRoomType = [arrOriginal filteredArrayUsingPredicate:predicateRoomType]; // TAKES A LONG TIME EACH LOOP-ROUND
[marrApartmentsByRoomType addObject:arrApartmentsThatMatchRoomType];
}
但是,第 3 步需要很长时间,因为原始列表可能包含大量(>100,000)项。似乎NSPredicate
遍历每个键值的整个列表。有没有一种更有效的方法可以根据键将大的拆分NSArray
成较小的 s ?NSArray
NSDictionary