問題タブ [viper-architecture]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - VIPER - クリーン アーキテクチャに関する質問
Robert Martin のClean Architectureについて、具体的にはVIPERについて読んでいます。
それから、私が現在行っていることのほとんどを説明している、MVC 代替手段を使用したこの記事/ Brigade の経験に出くわしました。
実際に新しい iOS プロジェクトに VIPER を実装しようとした後、いくつかの質問に遭遇しました。
- プレゼンターがビュー内の情報を照会しても問題ありませんか、それとも「情報の受け渡し」は常にビューから開始する必要がありますか? たとえば、ビューがプレゼンターで何らかのアクションをトリガーした場合、そのアクションを介して渡されたパラメーターによっては、プレゼンターがより多くの情報を必要とする場合があります。つまり、ユーザーが「doneWithState:」をタップし、状態 == 「何か」の場合、ビューから情報を取得してエンティティを作成し、状態 == 「何か他のもの」の場合、ビュー内の何かをアニメーション化します。この種のシナリオをどのように処理すればよいですか?
- 「モジュール」(VIPER コンポーネントのグループ) が別のモジュールをモーダルに提示することを決定したとしましょう。2 番目のモジュールをモーダルで表示するか、最初のモジュールのワイヤーフレームにするか、2 番目のモジュールのワイヤーフレームにするかは、誰が決定する責任がありますか?
- また、2 番目のモジュールのビューがナビゲーション コントローラーにプッシュされたとします。「戻る」アクションはどのように処理する必要がありますか? 2 番目のモジュールのビュー コントローラーのアクションを使用して「戻る」ボタンを手動で設定する必要があります。これは、プレゼンターを呼び出し、2 番目のモジュールのワイヤーフレームを呼び出して閉じ、最初のモジュールのワイヤーフレームに、最初のモジュールのビュー コントローラーが閉じられたことを伝えます。何かを表示したいですか?
- 異なるモジュールは、ワイヤーフレームのみを介して会話する必要がありますか、それともプレゼンター間のデリゲートを介して会話する必要がありますか? たとえば、アプリが別のモジュールに移動した後、ユーザーが「キャンセル」または「保存」を押した場合、その選択に戻って最初のモジュールで何かを変更する必要があります (おそらく、保存されたアニメーションを表示するか、何かを削除します)。 )。
- PinEditViewController が表示されるよりも、地図上でピンが選択されたとしましょう。戻るとき、PinEditViewController の使用アクションに応じて、選択したピンの色を変更する必要がある場合があります。現在選択されているピン、MapViewController、MapPresenter、または MapWireframe の状態を保持する必要があるのは誰ですか?戻ったときにどのピンの色が変わるかを知るためには?
ios - Swift のプロトコルに準拠するオブジェクトと変数の単体テスト
VIPER アーキテクチャのセットアップがあり、ワイヤフレームのインスタンス化を単体テストしようとしています。
VIPER が何であるかを知らない人にとって、理解すべき重要な部分は、重要な責任を持つ 4 つのクラスがあるということです。ワイヤーフレームは、残りの 3 つ (ビュー、プレゼンター、インタラクター) を作成します。ワイヤーフレームは、以下のようにそれらを適切に接続します。
そのため、Swift で単体テストを作成していますが、これらの接続がセットアップされていることを確認するのに苦労しています。コード自体は機能することに注意してください。単体テストでのアサートが問題です。
これら 2 つのアサートはどちらも正しくコンパイルされません。
XCTAssertEqual の場合、このエラーが発生します
XCTAssert (または XCTAssertTrue) の場合、このエラーが発生します
完全を期すため、および誰かがコードを役に立つと思うかもしれないため:
ios - iOS アプリケーション VIPER アーキテクチャ - dataManager の数は?
VIPER Architectural パターンのコンテキストで、この質問に対する答えを探しています-
web api
aと a の両方と通信するアプリケーションがある場合、 1 つ、2 つ、または 3 つ持つ必要がありますdatabase
かdataManagers
?
場合
a) dataManager
b) APIDataManager
およびLocalDataManager
c) dataManager
、APIDataManager
およびLocalDataManager
どこで
a)あなたが持っている可能性のあるサービス(リモートまたはローカル)と話すinteractor
シングルと話します。dataManager
b)はと情報のinteractor
違いを認識し、と のいずれかを呼び出します。これらは、それぞれリモート サービスとローカル サービスと通信します。local
remote
APIDataManager
LocalDataManager
c)interactor
は将軍にのみ話しかけ、次にdataManager
将軍dataManager
は に話しかけAPIDataManager
、LocalDataManager
編集
決定的な解決策はないかもしれません。しかし、どんな意見でも大歓迎です。
ios - iOS アーキテクチャとデータのプリフェッチ
私はしばらくの間、幸福のないエレガントなソリューションを探していました。
したい:
- VIPER、MVVM、その他が対処する大規模なビューコントローラーの問題を解決し、
- 完全にレンダリングされた画面間の遷移を常にアニメーション化します。
これは Apple のフレームワークと戦っているように感じます。ビュー コントローラーは、ナビゲーション フローの運転席にあります。私はそれを逆にして、コードで全体的なナビゲーションを行うことを考えていますが、問題は、View Controller を所有するオブジェクトをどのような種類で作成し、いつインスタンス化するかです。アクティビティ インジケーターはソース シーンに表示されます。
viper-architecture - VIPER アーキテクチュアを使用して非同期イメージ読み込みをセットアップする方法は?
アプリの性質は、ユーザーが tableView を下にスクロールすると、すべての行に UIImages を表示する UITableView です。VIPER アーキテクチャを壊さずにイメージをセルにロードするにはどうすればよいですか?
プレゼンターが関与しておらず、VIP の境界間で構造が渡されないため、上記の方法はどちらも VIP を壊すようです。
VIPを使用して(メインスレッドをブロックせずに)ダウンロードされた画像を取得するための非同期呼び出しを行うために、TableViewのUIImagesを取得することをどのように提案しますか? 呼び出しパターンを次のようにすることはできますが、ステップ 4 で混乱します。
- VC --> interacterOutput.loadImage("someLink")
- Interacter --> 画像を取得する作業を行い、UIimage をプレゼンターに送信します
- プレゼンター --> UIImage は既に VC の正しい形式になっているため、情報を VC に戻します。
- VC --> セルがイメージの準備ができていることを認識できるように、コードをどのように設定すればよいですか? tableView全体をリロードしたくない
どんな助けでも大歓迎です。
ios - VIPERでUIViewアニメーションコードを配置する場所は?
VIPER デザイン パターンに従って、UIView アニメーション コードをどこに配置する必要がありますか?
ビューまたはプレゼンターにある必要がありますか?
ノート:
CustomView
タッチしたら画面上を移動したい があります。
が私のCustomView
画面に追加されますViewController
ios - VIPER アーキテクチャで一方向ではなく双方向でプロトコルが使用される理由
アーキテクチャを MVC から VIPER に変更したいと考えています。http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/に従って、基本的なチュートリアルを読みました
ソースコードリンク: https://github.com/mutualmobile/Counter
ビューコントローラーからの通信の場合 ---> プレゼンターはプリセッターのオブジェクトとプレゼンターを介して行われます --- > ビューコントローラーはデリゲート (プロトコル) を介して行われます。これは保持サイクルを避けるためだと思います。
しかし、私はもう1つのチュートリアルも行いましたhttps://www.objc.io/issues/13-architecture/viper/ ソースコードリンク: https://github.com/objcio/issue-13-viper
彼は VTDListWireframe で両方向にのみプロトコルを使用しました
ここ
1) 双方向でプロトコルを使用する利点は何ですか?
2)私は、両方のプロトコル参照が両方のクラスで強力なプロパティ宣言を使用していることに気付きました.保持サイクルにつながりませんか?
ios - VIPER で DataManager と Interactor の間で情報を渡すために、コールバックまたはプロトコルをブロックしますか?
アーキテクチャ パターンを使用する場合、 から にオブジェクトを渡すために どちらを使用Objective-C
するかが推奨されます。DataManager
Interactor
VIPER
特にBlock Based Callbacks
vs. a の使用DataManager Output Protocol
VIPERの元の Mutual Mobile 記事の To Do アプリのサンプル
Block Based Callbacks
そのように使用します
- (void)todoItemsBetweenStartDate:(NSDate *)startDate endDate:(NSDate *)endDate completionBlock:(void (^)(NSArray *todoItems))completionBlock;
一方、ブリゲードエンジニアリングからのこのアプローチは
を利用しOutputProtocol
ますDataManager
[self.interactor foundUser:user];
どちらがより良い方法で、その理由は何ですか?
注: Swift を使用する場合、クロージャーによってコールバック メソッドがよりクリーンになることはわかっています。この質問は、Objective-C を直接参照したものです。