2011-02-01 14 views
3

コアデータにバックアップ検索を追加しようとしていて、パフォーマンスの問題が発生し始めました。私は現在、2つのNSFetchedResultsController(通常のものと検索のもの)の関連付けをしています。私のUISearchDisplayDelegateメソッドでは、私は毎回NSFetchedResultsControllerをリリースして再作成します。しかし、これは入力中に遅延を引き起こします! NSFetchedResultsControllerをフィルタするより効率的な方法はありますか?バッチサイズを約50項目に設定していて、データベースに差がある場合は、数千のレコードがあります。ありがとう!iOSフィルタNSFetchedResultsControllerが効率的に

答えて

4

NSFetchedResultsController documentationは、それはかなり明確になります:

  • キャッシュがある場合は、それを削除します。
  • fetchRequestプロパティを更新します。既存のフェッチ要求を単純に変更することはできません。新しいものを作成する必要があります。
  • -executeFetch:を呼び出します。私は助けFetchedResultController

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"attribute CONTAINS [cd] %@", searchString]; 
    NSArray *searchResults = [[self.fetchedResultsController fetchedObjects] filteredArrayUsingPredicate:pre] 
    

    希望の結果をフィルタリングするために、次のコードを使用し

+1

は 'NSFetchedResultsControllerを再作成するよりも効率的、このです'フェッチを実行するための新しい呼び出しが毎回与えられていることを考えれば、 –

+0

少なくとも、NSFetchedResultsControllerを作成して破棄するオーバーヘッドはありません。だから、私はそれがどれくらい効率的であるかの指標を持っていませんが、それはすべきです。 –

+0

ありがとうございます。私は試してみましょうが、実際にこれを修正するために、非同期コードをいくつか追加して(そしてフェッチを遅らせる)必要があるようです。 –

3

+0

この方法は、 'UITableView'を行ごとに更新する必要がある場合には使用できません。 –

0

することができますはい:

NSFetchRequestインスタンスを作成し、そのソート記述するたびに変更します。

let shortDescriptor = NSSortDescriptor(key: key, ascending: ascending) 
    request.sortDescriptors = [shortDescriptor] 

    do { 
     try fetchedResultViewController?.performFetch() 
    } catch let error as NSError { 
     print("Error in fetch \(error)") 
    } 

はリンゴのドキュメントを読むhttps://developer.apple.com/reference/coredata/nsfetchedresultscontroller