簡體   English   中英

核心數據:中斷執行NSFetchRequest

[英]Core Data: Interrupt executing NSFetchRequest

一直在搜索高低:

在Core Data中,有沒有辦法中斷/停止/取消和執行NSFetchRequest?

我正在iPhone應用程序中實現增量搜索,我已經嘗試過優化它的各種方法,但這還不夠(我有42,000條記錄),所以我必須在NSOperation中運行它。 鍵入新字符時,我需要取消之前的fetchRequest,但[nsoperation cancel]不執行任何操作。

另一種方法可能是將我正在搜索的字段移動到其他可中斷的索引中,可能在內存中,或者可能是一個單獨的sqlite3數據庫,它似乎可以用sqlite_interrupt中斷。

你問題的直接答案是否定的。 您最好的選擇,當前的設計是在操作中執行它們,但是您有線程障礙來擔心並減慢您的速度。 請記住,如果您的操作沒有在主線程上運行,那么您需要一個單獨的NSManagedObjectContext來進行操作,否則您將遇到線程問題。

更好的問題:你為什么要為每個角色做一個新的獲取?

如果您已經擁有先前搜索的獲取結果且用戶未刪除字符,則只需獲取現有結果並針對NSArray運行謂詞。 這將進一步細化搜索,而不是每次都進入磁盤。 因為它在內存中會非常快。

實現搜索字段時,請考慮以下選項:

  • 僅在第一個字符上點擊磁盤
  • 僅在從搜索框中刪除字符時才能點擊磁盤
  • 考慮預加載objectID和searchable屬性以避免磁盤命中。

根據您正在搜索的內容(以及有多種方法可以重新規范Core Data存儲以改進搜索),您可以在內存中預加載相當多的內容。 即使有42K記錄,如果搜索屬性足夠小,您也可以將它們全部加載到內存中。

如果用戶按“A”開始,您仍然需要測試該用例。

NSFetchRequest哪一部分很慢? 點擊SQLite數據庫還是將數據加載到內存中? 根據您的回答,您可以直接提高搜索性能。

我的解決方案是讓查詢操作繼續運行,但在發送事件以更新UI之前檢查它們是否已被取消。

這並不完美,因為你仍然可以運行大量的查詢操作,結果永遠不會被使用,但它仍然要快得多。

我實際上和你有同樣的問題。 為了解決這個問題,我使用了performSelector:afterDelay:方法

這有點棘手,但是當用戶快速鍵入快速3個字母時,我不想發送3個請求,但只有一個用戶完成輸入時。 我設置了0.5或更長的小延遲。

並使用此代碼:

[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(fetchSearch:) withObject:searchQuery afterDelay:0.5];

如果用戶快速鍵入,它將取消先前的請求並僅發送最后一個請求。

簡短回答 - 不,不是直接,抱歉。

答案很長 - 是的,但你必須做很多工作或努力去做

您將需要在后台線程中運行它(聽起來您已經通過NSOperation進行了操作)

在您的提取中,設置限制以一次獲得20個結果並在循環中運行它。 每次循環時,將其獲得的結果添加到數組中。 每次獲取每組結果時,請檢查是否要取消請求。

暫無
暫無

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

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