【特集】

TigerのCocoaにみるMVCの完成 - スマートなデータモデルを実現するCore Data

12 各レイヤの協調動作

    木下誠  [2005/10/31]

    ここまで、コントローラレイヤであるCocoa Binding、モデルレイヤに位置するCore Data、そしてこれらの間をつなぐためのキー値コーディングを説明してきた。

    必要な部品は出そろった。最後に、新しくなったCocoaアプリケーションは、これらをどのように協調動作させるのか、全体像を見てみることにしよう。

    新しいMVCアーキテクチャ

    まず、全体像を説明しよう。下の図のようになる。CocoaのMVCアーキテクチャは、この図にあるように、モデルとビューの間をコントローラでつなぐ、いわばM-C-Vとでもいう構造になっている。

    Cocoa MVCアーキテクチャ全体像

    下から順に説明していこう。まず、図で一番下に位置するのは、モデルレイヤだ。Core Dataが受け持つことになる。オブジェクトグラフの管理、ディスクへの書き込み等を行う。

    モデルとコントローラの間には、仲介役となるオブジェクトが存在する。これは、アプリケーションのタイプによって異なる。アプリケーション全体で1つのドキュメントしか扱わない場合は、アプリケーションのdelegateが行う。複数のドキュメントを作成する場合は、ドキュメントを表すクラスであるNSDocumentのサブクラスの、NSPersistentDocumentが行う。

    このクラスは、プログラマが作成するクラスであり、ここを起点として、アプリケーションの拡張を行う。逆に言えば、ここ以外はほとんど触る必要が無い、ということだ。管理対象オブジェクトの作成等は、ここで制御する。

    その上にあるのが、コントローラレイヤだ。ここは、NSObjectControllerのサブクラスたちが位置する。コントローラレイヤの役割は、何度も説明しているように、ビューとモデルの同期を行うことだ。そのために、Cocoa Bindingが使われる。ビューとのバインディングは、従来通りのものが使われる。モデルとの同期には、さきほど説明した、デリゲートオブジェクトかNSPersistenDocumentへのバインディングが使われる。これは、次項で詳しく説明しよう。

    コントローラレイヤで使われるクラスは、ビューのタイプによって使い分ける。1つのオブジェクトとバインディングするためのNSObjectController、オブジェクトの配列を取り扱うためのNSArrayController、そして木構造のオブジェクトを取り扱うNSTreeCotnrollerがある。

    一番上に位置するのが、ビューレイヤになる。ビューは、コントローラと同期することで動作させる。このレイヤ間のバインディングは、Interface Builderで行うことになる。

    これで、ビューからコントローラを経由して、モデルへと至る道ができあがった。

    コントローラとモデルの接続

    前項のうち、コントローラとモデルの接続について、もう少し詳しく説明しよう。

    まず、モデルへの接続は、すべて管理対象オブジェクトコンテキストを経由して行われる。このクラスが、コントローラとのやり取りをすべて取り仕切ることになる。具体的には、コントローラで管理対象オブジェクトコンテキストとのバインディングを行っている。コントローラにはmanagedObjectContextというバインディング項目があり、ここで接続している。

    managedObjectContextのバインディングの設定

    また、コントローラは、オブジェクトの作成を行う。管理対象オブジェクトの作成には、Core Dataの項で説明したように、管理対象オブジェクトコンテキストに加えて、エンティティが必要だ。そのために、コントローラにエンティティを設定することができる。この設定に従って、コントローラは自動的に対応する管理対象オブジェクトを作成し、それをコンテキスに登録してくれる。

    それに加えて、NSArrayControllerやNSTreeControllerといった複数オブジェクトを取り扱うコントローラには、Predicateを設定することができる。これで、表示するオブジェクトを、自動的にクエリーを使って取り出すことができる。

    コントローラへの、エンティティとPredicateの設定

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン