2017-04-23 3 views
0

ViewController A、そのviewModel AVMがあるとします。 AにはviewController BとviewModel BVMというcontainerViewがあります。 AにはBの参照があり、AVMにはその子ビューモデルとしてのBVMの参照があります。iOSで子MVVMを使用するMVVMはどのように動作しますか?

そして、I BはUIImageViewを有しとsetSDImage(URL)機能を有しているマネージャークラスであるCは、

B.

からそのようなsetSDImage(URL)などのBの関数を呼び出し、Bの挙動を制御しますコールバック。ボタンが押されたときにボタンが押されたときに のsetSDImage(URL)をトリガーします。

問題は次のとおりです。Aボタンを押してAVMに行き、AVMに連絡してC関数呼び出しがUIレイヤーであるsetSDImage(url)であるため、CはBの参照を取得しなければなりません。また、コールバックは、私はそうではなくB.

よりBVMにこの作業を取得する方法がわからない理由です、同様にBに実装する必要があり、この場合の質問:

1、マネージャクラスCはBの動作を制御します.AVはBの参照を渡さずにCとどのように接触しますか? (VMはViewController /ビューについて知りたくないので)

2、マネージャークラスCはBまたはBVMを制御する必要がありますか?私はそれがBVMの代わりにBを制御するので、a)設定されたイメージ関数はBであるUILayerで行われなければならないからです。b)コールバックはUILayerで実装する必要がありますか?

答えて

1

あなたの説明だけで何が起こっているのか理解するのは少し難しいですが、URLを取るsetSDImageというメソッドは、ビューコントローラに属していないと言います。ビューコントローラは、画像データをダウンロードしてUIImageに変換してUIImagViewに設定してください。

イメージをダウンロードして変換する作業は、BVMによって開始され、UIImageが準備完了のときにBに通知されます。

あなたの2番目の質問に答えるために、CにはBVMへの参照が含まれているはずです。これはAVMで簡単にできるはずです。

それは意味がありますか?

+0

返信用Thx。私は画像をダウンロードするためにSDWebImageライブラリを使用しています。それらの機能は '' '[' '' ['' NSWRL URLWithString:@ "https://graph.facebook.com/olivier.poitrey/picture"]です。 オプション:SDWebImageRefreshCached]; '' '。つまり、私はビューコントローラでそれをやっているはずです。 UIImageViewではなくUIImageViewに直接設定されているためです。 –

+0

私は「UIView」の拡張機能のファンではありません。技術的には、コードはビューには実装されていませんが、ビューにそのビヘイビアが関連付けられているため、MVCとMVVMの違反のように感じられます。ただし、UIImageの代わりにURLを渡しても、同じパターンに従うことができます。 MVVMの鍵は、VCがVMと直接通信できることですが、VMはプロトコルやKVOなどの間接的な方法でVCとの間でのみ通信します。 –

関連する問題