2015-11-09 53 views
0

我需要在大約50.000條記錄中搜索NSDictionary的大NSMutableArray。我試着用:在NSDictionary的大NSMutableArray中搜索

for (NSDictionary *aProduct in self.arrProduct) { 
    if ([[aProduct objectForKey:@"Name"]rangeOfString:@"search string" options:NSCaseInsensitiveSearch].location != NSNotFound) { 
     //got it 
    } 
} 

但是有50.000的對象,這個函數的性能很差。 我不想使用Sqlite進行搜索。 有什麼想法?

TKS,

+0

是「self.arrProduct」本地數組? – Jamil

+0

也許是'NSPredicate'? – Larme

+0

爲什麼你會在移動設備上擁有如此龐大的陣列?爲什麼不是SQLite/Core Data? – Wain

回答

0

您可以嘗試使用enumerateObjectsUsingBlock:不是快速列舉。

查看this瞭解更多詳情。

另外:enumurateObjectsUsingBlock Vs for loops

+0

它仍然會很慢。 – trojanfoe

+0

50k記錄很多,但enumerateObjectsUsingBlocks仍然更快或更快。引用第二個鏈接: 「enumerateObjectsUsingBlock:與快速枚舉一樣快或快(for(... in ...)使用NSFastEnumeration支持來實現枚舉)。快速枚舉需要從內部表示轉換爲表示「 – Lneuner

+0

我不知道你的情況會有多快,但你可以比較它們,並讓我們知道結果 – Lneuner

0

如果每個數據都有一個獨特的密鑰,你想和一個特定的鍵搜索的內容,那麼你可以使用Hash table

或者,搜索鍵是一個數字,並且您需要range search,例如key > 5 && key < 10。那麼我認爲ordered binary tree將會有所幫助。二叉樹的實現可能在GitHub中找到,我支持某人已經做到了。


至於我,我更喜歡用SQLite來解決這類問題。向搜索關鍵字添加索引將加快搜索性能。我不喜歡在主內存中存儲大量數據。

+0

是的,我更改爲SQLite,因爲我發現其他商店有200k產品,並且不能使用NSUserDefault來緩存 – thienlode

+0

如果您需要緩存, TMCache](https://github.com/tumblr/TMCache)可以幫助你。一般來說,'數據庫系統'會實現一些緩存機制來提高性能。我使用'SQLite緩存'作爲關鍵字,谷歌給出了很多帖子。 – AechoLiu

0

最後,我使用CoreData。大尺寸數據無法順利運行。