Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 635 - Zoomania 4

アプリを立ち上げると自動的にデータがロードされるクラス、DataHelperを作りました。次はこれをNSFetchedResultsControllerを使ってUITableViewに表示しなければなりません。

まずどうしても必要なのがUITableViewです。UITableViewの設置は何度もしているので今更説明する必要はないので次の手順に従います。

yataiblue.hatenablog.com

UITableViewのプロトコールに準拠するのは当たりませとしてNSFetchedResultsControllerを利用するためにプロトコールに準拠させる必要があります。

f:id:yataiblue:20160402105227j:plain

さて、私の読んでいるチュートリアル(何をパクっているか分かった人いますが?)によると、著者はNSManagedObjectContextインスタンスのベストな扱い方を色々考えていたようです。

私の過去のチュートリアルのように、必要になった時に何度も同じコードを書いてAppDelegateから読み込むのではViewControllerファイルに長たらしいコードが並んで*1見た目に汚いコーディングになります。

彼はAppDelegateファイルでNSManagedObjectContextのインスタンス*2されているので、ViewControllerにそのリファレンスとして渡してしまうというやり方を取っていました。

具体的にコードで説明します。ViewControllerファイルのコードを続けます。

class ViewController: UIViewController, 
                       UITableViewDataSource, 
                        UITableViewDelegate, 
                         NSFetchedResultsControllerDelegate {
    
    var context: NSManagedObjectContext!

...

このように変数contextを宣言した場合、普通ならばイニシャライザーを使ってインスタンス化させなければならないのですが、裏で(AppDelegate)でインスタンス化しているNAManagedObjectContextを渡してしまおうということです。

ということでAppDelegateファイルをみます。

func application(application: UIApplication, 
  didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) 
   -> Bool {
        // Override point for customization after application launch.
        
        let dataHelper = DataHelper(context: self.managedObjectContext)
        
        dataHelper.seedDataStore()
 // ここまでのステップはデーターベースに値を入れるステップです。
        
        let rootViewController = 
           self.window!.rootViewController as! ViewController
        rootViewController.context = self.managedObjectContext;
// ここがポイントです。

...

let rootViewController = self.window!.rootViewController as! ViewController」がポイントです。開発中のViewController、そうです変数contextを持たせたViewControllerをrootViewControllerにキャストさせます。

そしてAppDelegateが持っているプロパティmanagedObjectContextを指定してやると、ViewControllerでcontextとして動くようになります。結構スマートで美しいコーディングですね。

今日はここまで。

*1:CoreDataDemo3の一連のコーディングです。

*2:プロジェクト作成時にUse CoreDataのチェックマークを入れた場合です。