【发布时间】:2013-01-15 10:16:19
【问题描述】:
我们有一个应用程序调用 SOAP Web 服务并检索一长串 XML,然后应用程序将其解析为 NSArray 的 NSDictionary 对象。 NSArray 包含一个出租公寓信息列表,每个信息都存储在一个NSDictionary 中。
整个列表可能包含 10 种不同类型的公寓(即 2-room、3-room),我们需要根据 Room-Type 将 NSArray 拆分为更小的 NSArrays,其中包含 key " NSDictionary 对象中的 roomType"。
目前我们的算法是
- 使用
[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 似乎遍历了每个键值的整个列表。有没有更有效的方法可以根据 NSDictionary 键将大的 NSArray 拆分为较小的 NSArrays?
【问题讨论】:
标签: ios nsmutablearray nsdictionary filtering split