2017-01-14 13 views
0

私のアプリケーションでは、コアデータスタックをAppDelegateから、LiftEventDataManagerという独自のクラスに移動しました。私はこのスタックへの参照を取得するいくつかのクラスがあります、そして、私は新しいNSManagedObjectContextが作成されるたびに、もちろん。これらの参照は、dbからの一部のデフォルトアプリケーションデータをプルする(たとえば、ユーザーの選択肢のリスト)ようにするために使用されます。シングルトンを使用せずに正しいNSManagedObjectContextを保存するにはどうすればよいですか?

最初のviewControllerが提示されたとき、私のviewModelは私のLiftEventDataManagerに新しいオブジェクトのビューをバックするように頼んでいます。ユーザーの入力はこのオブジェクトのプロパティを設定するために使用され、完了したらオブジェクトを保存します。ただし、オブジェクトは保存されていません。

ユーザータップは、保存、viewModelLiftEventDataManagerへの参照を使用しており、この機能(スウィフト2.3)を呼び出します:

func saveLiftEvent() { 
    do { 
    try moc!.save() 
     } catch { 
      let saveError = error as NSError 
      print("\(saveError), \(saveError.userInfo)") 
     } 
    NSNotificationCenter.defaultCenter().postNotificationName("LiftEventDidSave", object: nil) 
} 

私はそれを求めて私のviewModelによって作成されたので、オブジェクトが保存されていないと信じてLiftEventDataManagermanagedObjectContextとなるでしょうが、私が推測しているLiftEventDataManagerによって保存されていると呼ばれているのは、新しいのCore Dataスタックへの参照です。

let moc = newLiftEvent.managedObjectContext 

、その後saveLiftEvent(moc: NSManagedObjectContext)に渡す:私は、私は、オブジェクトのmanagedObjectContextを取得する可能性があるとします。

適切に保存する方法について自分の質問に答えたのですか、またはデザインに欠陥がありますか?私はシングルトンを使いたくないことを覚えておいてください。

+0

「NSManagedObjectContext」と同じインスタンスが常に必要です。その理由は、AppleがAppDelegateでコアデータスタックを残した理由です。代替は確かに...シングルトンです。どうしたの? – vadian

+0

ダン。ありがとう@vadian。私は今それを修正しました。 – Jim

+0

私のアプリは比較的シンプルなので、シングルトンを必要とする心配はありません。私はまた、私のコードを必要以上に複雑にしたり、単体テストのために作成した面倒を処理したりしたくありません。 – Jim

答えて

0

NSManagedObjectContextを何らかの方法で送る必要があります。シングルトンはそれを行う一つの方法ですが、確かにそれを行う唯一の方法ではありません。

あなたが必要とする度に、新しいインスタンスLiftEventDataManagerを作成しているようです。新しいインスタンスを作成する代わりに、ある種の依存関係注入を使用して既存のインスタンスを渡すことができますか?

ビューモデルにデータマネージャーのリファレンスがある場合は、シングルトンを作成せずに物事を集中化するのに適しています。

+0

そうです、Dave。それは私がやっていることであり、私の問題を引き起こしているのです。私は私の質問をして以来、私はたくさんの研究をしてきました。私は、依存性注入が行く方法だと思っています。コンセプトはシンプルですが、もし私がそのルートに行くのであれば、未解決の問題があります。私の理解は、私は前後にコンテキストを1つのビューコントローラから渡すことです。私はそれをどのようにするかが重要です。たとえば、私はそれを必要とする2つのユーティリティクラスを持っています。これは、おそらく私はそれらの間のインターフェイスを変更する必要があるので、私は必要なときにそのコンテキストを渡す必要がありますか? – Jim

+0

私の経験では、CoreDataはすべてのコードで容易に絡み合うフレームワークのタイプなので、後で変更することは難しいでしょう。 VC間で直接CoreDataオブジェクトを渡すと、それらをデータレイヤーに強く結合します。 CoreDataが独自のビューモデルや抽象化された永続性レイヤの背後に隠れていると、柔軟性が保持されます。より具体的な質問があれば、より具体的に答えることができてうれしいです。 –

+0

ありがとう、Dave。ここで私は立ち往生した。あなたは私が持っていないものを持っているので、あなたは何をしているのか分かっているようです。経験。そして、彼らが何をしているのかを知っている他の誰かが、VCがiOSアプリの流れを制御し、コンテキストを渡す場所だと言います。もしあなたがそれにしているなら、私はこの記事のコメントでBluesmanです:https://cocoacasts.com/building-the-perfect-core-data-stack-passing-it-around/それは本当に役に立つでしょうあなたがそれについて何を考えているかを知る。 – Jim

関連する問題