我们有一个应用程序调用一个SOAP web服务并检索大量的XML,然后将其解析成一个NSDictionary对象的NSArray。该NSArray包含租赁公寓信息列表,每个公寓信息都存储在一个NSDictionary中。
整个列表可能包含10种不同类型的公寓(即2房、3房等),我们需要根据房间类型(在NSDictionary对象中具有"roomType"键)将NSArray分成更小的NSArray。
目前我们的算法是:
1.使用"[NSArray valueForKeyPath:@“distinctUnionofObjects.room-type”]"获取唯一的房间类型值列表。
2.循环遍历唯一的房间类型值列表。
3.对于每个唯一的房间类型值,使用NSPredicate从原始列表中检索匹配的项目。
我们的代码如下(为了清晰起见进行了重命名):
整个列表可能包含10种不同类型的公寓(即2房、3房等),我们需要根据房间类型(在NSDictionary对象中具有"roomType"键)将NSArray分成更小的NSArray。
目前我们的算法是:
1.使用"[NSArray valueForKeyPath:@“distinctUnionofObjects.room-type”]"获取唯一的房间类型值列表。
2.循环遍历唯一的房间类型值列表。
3.对于每个唯一的房间类型值,使用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];
}
然而,第三步可能需要很长时间,因为原始列表可能包含大量(>100,000)的项目。似乎每个键值对都要通过整个列表的NSPredicate
。是否有更有效的方法,可以根据NSDictionary
键将大型NSArray
分成较小的NSArray
?