2016-04-19 5 views
1

私は非常に大きなプロジェクトを持っており、私はリファクタリングセッションに参加しています。最初は私のアイデアは良く聞こえましたが、今は私は固執し混乱していますし、git rollbackの前には近くにあります。あなたたちは私の最後のチャンスです。CoreData-Stack全体をフレームワークに入れることは可能ですか?

CoreDataに存在するいくつかのデータを表示するGUIアプリケーションを作成しました。バックグラウンドプロセスは、ネットワークから時々データをフェッチして、CoreDataに入れます。

私は、CoreDataと<をリクエストしてGUIに表示させています。 それは私たちのために非常に良い作品です。それはまっすぐで、特別なものはありません。私の会社は1月からこのアプリケーションをプログラミングしており、要求側とデータ側は膨大になっています。 100%のテストカバレッジもあります! \ o /。そのプロジェクトで働くことは素晴らしいことかもしれません。もし... GUIの事柄が分かれば...。 時間が経つにつれ、開発チームを2つの部分に分割する必要があります.1つはgui(および同じデータモデルに基づくいくつかのGUIアプリケーション)です。もう1つはRequest-and-CoreDate部分です。私のモデルのインターフェースはきれいなエントリーポイントを持っているので、RequestとCoreDataのセクションを私のワークスペースのライブラリプロジェクトに移動するのは簡単だと思いました。

hm、いいえ!

私はKit.xcdatamodeldを新しいライブラリプロジェクトに入れました。私はすべてのモデルを生成し、メインアプリケーションのすべてのコードをlibに追加します。私はすべての問題を解決し、最初の基本テストを新しいプロジェクトに移し始めました。

私は、ApplicationDelegateのmanagedObjectModel部分を新しいプロジェクトのDataControllerに配置しました。新しいクラスからこのmanagedObjectを使用するように最初の呼び出しを変更しました。

let dc = DataController() 
_ = GlobalScope(context: dc.managedObjectContext!) 

エラーがmanagedObjectModelに発生するよりも、私はシンプルなエンティティを保存する必要がある最初のテストを実行すると:

lazy var managedObjectModel: NSManagedObjectModel = { 
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model. 
    let modelURL = NSBundle.mainBundle().URLForResource(" <LibName>Kit", withExtension: "momd")! 
    return NSManagedObjectModel(contentsOfURL: modelURL)! 
}() 

enter image description here

fatal error: unexpectedly found nil while unwrapping an Optional value 

、私の質問は:それは何をすることは可能ですCoreData全体をフレームワークに入れる?自分のGUIアプリケーションでデータモデルやリクエストがありませんか?計画はフレームワークを組み込み、私のモデルのgetXY()setXY()関数を使用することではありません。また、ネットワークバックグラウンドフェッチ全体がフレームワーク内の場所である必要があります。 しかし、フレームワークにmainBundleがないことを縫い合わせています。どのようにデータベースを正しい方法で入手するのですか?

ありがとうございました。 ps

+0

これはフレームワークか静的ライブラリですか?代わりにbundleWithIdentifierまたはbundleForClassを使用します。 – Wain

+0

ちょっとしたワイン、フレームワーク –

+0

フレームワークを扱うときにどのバンドルを使用するか注意してください。**メインバンドル**はあなたのものを指します。 main ** abc.app **、そこに含まれるフレームワークではありません。クラスなどのフレームワークを使いたいかもしれません。 – Jay

答えて

1

まず、Core Dataは既にフレームワークです。コアデータの上にレイヤをフレームワークに配置することを検討しています。出来ますか?おそらく、それは素晴らしい考えではありません。

フレームワークに3番目(またはそれ以上)のアプリケーションを置くことには価値がありません。よりクリーンで簡単にはできません。実際には、アプリケーションのデバッグをより困難にします。

Xcodeのグループを使用してコードを分離して呼び出します。別のXcodeプロジェクトに物事を入れようとすると(それがあなたが必要とするものです)、それは価値があるよりも多くの問題につながります。

ところで、独立したファイルであるため、モデルをフレームワークにコンパイルする方法はありません。したがって、主なアプリケーションは、とにかくモデルファイルを埋め込む必要があります。

独自のカスタムCocoaPodのような構造を作成することもできますが、実際にはそれほど価値がなく、メンテナンス性は低下します。

+1

私は矛盾します。私たちは通常、製品を小さなプロジェクトに分け、すべてをワークスペースに入れます。うまく動作し、アプリ内のレイヤーを構造化するのに多くの手助けをしてくれました。デバッグに関する問題は決して見つけられませんでした。 *モンスタープロジェクト*は、モンスタービューコントローラーと同じくらいIMHOです*。ちょうど私の2c。 – Jay

+1

Marcus、私はあなたの要点を見ていますが、アプリケーションの70%近くを占める同じデータモデルとそのモデルで動作する同じ機能を持っています。残りはGUIです。我々は、GUIの2番目と3番目のバージョンをリリースする予定です。そのモデル上で異なるアプローチ、同じデータモデル、同じ操作機能パーツを別々のプロジェクトに分けてはいけません。将来は私たちを殺してくれるはずです。 Questionは、CoreDataを使用するテスト可能なフレームワークを実装する方法です。メインアプリケーションがない場合はmanagedObjectModelをどのように実装するのですか? –

+0

ジェイ、それの例を教えてもらえますか?メインアプリケーションなしでmanagedObjectModelを動作させることはできません。まったく混乱してしまったり、まったく間違ったトラックにすぎません。 –

1

問題は、この行です:

let modelURL = NSBundle.mainBundle().URLForResource(" <LibName>Kit", withExtension: "momd")! 

それが存在しないリソースのメインバンドルに見ています。

let modelURL = NSBundle(identifier:"com.whatever.yourFrameworkIdentifier").URLForResource... 
関連する問題