我們有一個應用程序,它調用SOAP Web服務並檢索一長串XML,然後應用程序將其解析爲NSDictionary
對象的NSArray
。 NSArray
包含租賃公寓信息的列表,其中每個信息都存儲在NSDictionary
中。根據NSDictionary鍵值將NSArray拆分成子數組
整個列表可能包含10種不同類型的公寓(即兩房三房),我們需要根據房型分成NSArray
小房型,其中房型爲「roomType」 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];
}
但是,由於原始列表可能包含大量(> 100,000)的項目,因此步驟3需要很長時間。似乎NSPredicate
遍歷每個鍵值的整個列表。根據NSDictionary
密鑰,是否有更高效的方式將較大的NSArray
拆分爲更小的NSArray
?
感謝Jonathan的快速回復!將嘗試它,並測試性能是否更好使用此。似乎至少我們必須循環整個原始數組一次...... – AndyV