簡體   English   中英

如何提高核心數據的性能?

[英]How to improve Core Data performance?

我的應用程序有一個UISearchBar,允許用戶輸入搜索關鍵字。 每次擊鍵都會執行核心數據查詢,以便將結果顯示為搜索欄更改中的文本。

問題是搜索欄擊鍵非常糟糕......當然是因為提取速度慢。 任何想法如何提高性能?

我的核心數據由sqlite數據存儲支持,其中包含1000個對象。

// searchKeyword is the string appears in UISearchBar
// Both title and author may contain several words so I can't use BEGINSWITH
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(author CONTAINS[c] %@) OR (title CONTAINS[c] %@)", searchKeyword, searchKeyword];

NSEntityDescription* entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:managedObjectContext];

NSFetchRequest* request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setPredicate:predicate];
[request setFetchLimit:10];

NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray* sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];

[sortDescriptor release];
[sortDescriptors release];

execute request and fetch the results
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                managedObjectContext:managedObjectContext
                                sectionNameKeyPath:nil
                                cacheName:nil];
NSError* error = nil;
BOOL success = [fetchedResultsController performFetch:&error];
[request release];

使用CONTAINS可以減慢它的速度。 您需要做的是創建一個名為searchWords(或其他)的新表,並在該商店中標題中的所有單詞,小寫並刪除重音。 這些關系將它們鏈接回原始對象。 確保單詞字段已編入索引。

在此表上執行查詢,但不要使用CONTAINS或BEGINSWITH,而是執行類似的操作

單詞>“term”和單詞<“tern”

請注意,其中的第一個字符串是搜索項,第二個字符串是最后一個字符遞增的搜索項。 這允許Core Data使用SQL索引來執行搜索。

Apple有一個核心數據 WWDC會話,解釋了這一點,包括示例代碼。 示例代碼包含一個類,該類處理規范化字符串(即刪除大小寫),並以unicode感知方式遞增單詞的最后一個字符。

雖然Amoyra的推薦是合理的,但您也有設計問題。

只有輸入到搜索字段中的第一個字母應該永遠打盤。 在第一個字母之后,您應該只改進已經在內存中的搜索結果。

您應該使用已有的謂詞過濾內存中的數組(從第一個字母搜索),並避免執行獲取請求,因為它是不必要的。

此外,如果要搜索已經在內存中的數據(例如生活在NSFetchedResultsController ),那么整個搜索應該只搜索內存中的對象。 走向磁盤是不必要的,非常浪費。

雖然它不會加快查詢速度,但將查找放入后台線程將阻止按鍵滯后。

您可以逐步創建trie ,以便為過去的查詢創建索引(結果集由葉節點指向)。 但它不會增加單個查詢的性能。 你也可以調整擊鍵系統,不要在每次擊鍵后進行提取,但只有在擊鍵之后才能獲得一個時間間隔(作為一個閾值),然后再識別另一個擊鍵

啟動應用程序時,構建完整的trie,並在編輯時進行調整。 不要使用那個愚蠢的謂詞。 你只需要獲取1000條記錄,所以這應該不花時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM