前提
iOSアプリ設計パターン入門という本の内容を参考にしております。
問題
同じUseCaseを別の画面でも使用する際、UseCaseの生成はどのようにすればよいか。
詳細
例えば下記のようなApplicationクラスを作成し、UseCaseを必要とする際は Application.shared.useCase
としてアクセスするとします。
この時、例えばあるPresenterにてuseCase: ReposLikesUseCase!を利用しているとき、他の画面でもuseCase: ReposLikesUseCase!を利用したい場合はどうすれば良いのでしょうか?
useCaseのoutputをpresenterとして登録するので同じインスタンスを利用しようとすると、outputが上書きされてします。
そこで、次のような思考をしているですが、いまいち釈然としておりません。
→ ならば、別のUseCaseを作成し、公開プロパティとしてApplicationに保持する?
→ UseCaseが使用する画面ベースで増えていきそうだが良いのか?
→ UseCaseを作成するクラスを作成する?(UseCaseはPresenterからweak参照されるので、クラス内で変数として保持しnilにならないようにする必要がある?)
同じUseCaseを別の画面でも使用する際、UseCaseの生成の方針について、アドバイス等頂けますと幸いです。
import UIKit class Application { /// Shared instance static let shared = Application() private init() {} // ユースケースを公開プロパティとして保持 private(set) var useCase: ReposLikesUseCase! func configure(with window: UIWindow) { buildLayer() let storyboard = UIStoryboard(name: "Main", bundle: nil) window.rootViewController = storyboard.instantiateInitialViewController() } private func buildLayer() { // -- Use Case useCase = ReposLikesUseCase() // -- Interface Adapters let reposGateway = ReposGateway(useCase: useCase) let likesGateway = LikesGateway(useCase: useCase) // Use Caseとのバインド useCase.reposGateway = reposGateway useCase.likesGateway = likesGateway // -- Framework & Drivers let webClient = GitHubRepos() let likesDataStore = UserDefaultsDataStore(userDefaults: UserDefaults.standard) // Interface Adaptersとのバインド reposGateway.webClient = webClient reposGateway.dataStore = likesDataStore likesGateway.dataStore = likesDataStore // Presenterの作成・バインドは各ViewControllerを生成するクラスが実施 // (本プロジェクトではTabBarControllerのawakeFromNib()) } } protocol ReposPresenterInjectable { func inject(reposPresenter: ReposPresenterProtocol) }
あなたの回答
tips
プレビュー