2012-06-14 77 views
0

我使用NSJSONSerialization來解析我的Web服務中的一些JSON,並且我想知道最有效的解決方法。爲IOS解析器組織JSON的最佳方式

目前我生成以這種格式JSON:

[ 
    {"title":"title Val","description":"description val","appointmentDate":"2012-06-16T00:00:00"}, 
    {"title":"title Val","description":"description val","appointmentDate":"2012-06-16T00:00:00"}, 
    {"title":"title Val","description":"description val","appointmentDate":"2012-06-16T00:00:00"} 
] 

分析器構造一個NSArray,其中每個元素是包含約會細節(標題,描述,日期)的NSDictionary

現在我的應用程序實際上需要搜索解析的JSON約會之間的某些時間間隔日期,以便它可以顯示它們基於某些用戶操作。目前我只是掃描陣列並檢索符合條件的任何約會。這當然是O(n)。我是否應該以不同的方式表示我的JSON,當我想在特定領域進行搜索時?也許這樣?

{ 
    "2012-06-16T00:00:00" : {"title":"title Val","description":"description val"}, 
    "2012-06-18T00:00:00" : {"title":"title val","description":"description val"}, 
    "2012-06-20T00:00:00" : {"title":"title val","description":"description val"}, 
} 

這樣解析器將產生一個NSDictionary其中每行的關鍵是約會日期。這樣做效率更高嗎?或者我可以同樣快速地在NSDictionary對象的NSArray上執行二分搜索嗎?如果搜索數組,則有必要在比較謂詞中執行[row objectForKey:@"appointmentDate"],這可能是一項昂貴的操作。

回答

1

解析約會和使用像Core Data這樣的東西存儲它們,在你想要搜索的字段上設置索引?這可能比嘗試手動優化和搜索更簡單快捷。

雖然如果你想手動做,那麼是的,建立一個由你想要搜索的信息鍵入的排序索引會給你一個更有效的搜索。因此,您可以將自己的字典映射到NSDate(不要以字符串格式保存數據)到該日期的約會集合中,然後您可以對字典的鍵集執行二進制搜索(確保它首先被正確排序!)來確定在您的搜索間隔內的鍵的範圍。然後你可以進入詞典並獲取相應的約會。

1

如果約會是按順序進行的,只需進行二分搜索而不是線性搜索。除非你有成千上萬的物品,否則它可能會更快。

但是,花費您很多時間的一件事是重新解析日期。 NSDates的創建速度很慢,所以我建議在您讀入列表時將它們創建一次,或者將字符串轉換爲數值(例如自1970年以來的秒數),這些數值比較快。

+0

你是否認爲將字符串轉換爲日期是值得的,還是應該按照原樣比較它們?我使用的是yyyy-mm-dd,它畢竟是一種可排序的格式。 – Trent

+1

字符串可能很好。真的,你想測試一個相當嚴重的數據集,並查看瓶頸的位置,因爲它們並不總是你懷疑的地方。如果您發現您的代碼花費大量時間解析和比較字符串,請切換到數字。奇怪的是,在64位Mac OS X上,NSNumbers比在iOS或32位Mac OS X上更快,因爲它們大部分時間都將數字打包到對象指針中。 – EricS

相關問題