Swift NSFetchedResultsControllerの考察

NSFetchedResultsControllerについてまとめてみようと思う

NSFetchedResultsControllerを使うとCoreDataとUITableViewがとても便利になります。

実装例 frcImplはNSFetchedResultsControllerを実装(implement)していることを表す

  /// FetchedResultsControllerインスタンス
    private var frcImpl: NSFetchedResultsController<T>!

//ポイント
//こうすることで.frcでNSFetchedResultsControllerへアクセス出来る
    var frc: NSFetchedResultsController<T>
        { get { return frcImpl } }

次へボタンが押されたときの処理

   /// [次へ]
    @IBAction func nextDelivery(_ sender: Any) {
//複数条件の判定
        guard var border = uiRoutes.indexPathForSelectedRow?.row,
//ofRoutesで型を決定->frcで詰め込み(getter)->fetchedObjectsで配列のfetch結果が返却される。
                let clients = ofRoutes.frc.fetchedObjects else {
            return }

guard 複数条件の判定

アンラップした変数をスコープ外で利用します

カンマで区切って複数条件をチェックしつつアンラップできます。
長い処理の中での中断を判定する処理としてもguardを利用すべきです。

border, clients が条件のあと利用できます。アンラップされています。

clients CoreDataテーブルのDmClientをfetchした結果が配列で詰め込まれる

概念図

f:id:happy_teeth_ago:20190616121457p:plain

ofRoutes

   /// 配達エリア一覧Table data source
    private var ofRoutes: ObservedFetchedRoutes!


// MARK: 配達先Table data source
  fileprivate class ObservedFetchedRoutes: ObservedFetchedData<DmClient>,UITableViewDataSource {

ObservedFetchedRoutes

ObservedFetchedRoutes はObservedFetchedDataを継承 DmClientはcoredata のテーブル

ObservedFetchedData

CoreDataのfetchの値監視しているクラス

/// CoreDataの fetch と fetch後の変更監視、TableView への供給と自動更新を行う
class ObservedFetchedData<T: NSManagedObject>:
    NSObject, NSFetchedResultsControllerDelegate {

NSFetchedResultsControllerDelegate はいろんなタイミングでfetch結果を返却してくれる

fetchedObjects

NSFetchedResultsControllerのプロパティでfetchした結果を配列で返却してくれる。

fetchしていないと、nilが返却される

developer.apple.com

これらをテーブルに表示していく。 つづく。