CoreDataQuery と NSFetchedResultsController を組み合わせる

CoreData でデータをフェッチするときは NSFetchedResultsController を使いたいけど、 CoreDataQuery には NSFetchedResultsController を取得するメソッドが無い。

その代わり NSFetchRequest は取得できるから、 CDQQuery っていう CoreDataQuery 内部で使われているクラス拡張して、 NSFetchedResultsController を取得するメソッドを追加している。

module CDQ
  class CDQQuery
    def fetchedResultsController
      NSFetchedResultsController.alloc.initWithFetchRequest(
        self.fetch_request,
        managedObjectContext: self.context,
        sectionNameKeyPath: nil,
        cacheName: nil 
      )
    end

    def fetch(params={})
      ctrl = self.fetchedResultsController
      ctrl.delegate = params[:delegate]
      error_ptr = Pointer.new(:object)
      unless ctrl.performFetch(error_ptr)
        NSLog(error_ptr[0].localizedDescription)
      end
      ctrl
    end
  end
end

使い方はこんな感じ

Entry.sort_by(:createdAt).fetch(delegate: self)

そうえいば、MotionDataWrapper でも同じことやったな。