Contenu connexe
Similaire à 既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった (20)
Plus de Fumiya Sakai (20)
既存プロジェクトで使っていたDIをお引っ越し&DIYすることになった
- 22. DIコンテナの中で実行する処理のコード例(1)
名前と型による管理をすることで適切な処理を選択する事例(1)
処理レイヤーによって利用するスレッドを適切に指定するために第2引数を活用:
let background = "background"
dependecies.register(
ImmediateSchedulerType.self,
impl: MainScheduler.instance
)
dependecies.register(
ImmediateSchedulerType.self,
impl: SerialDispatchQueueScheduler(qos: .default),
name: background
)
CategoryCoursesPresenterImpl(
getCategoryCoursesUseCase: dependecies.resolve(GetCategoryCoursesUseCase.self),
stockCourseUseCase: dependecies.resolve(StockCourseUseCase.self),
unstockCourseUseCase: dependecies.resolve(UnstockCourseUseCase.self),
mainScheduler: dependecies.resolve(ImmediateSchedulerType.self)
)
dependecies.register(
CategoryRepository.self,
impl: CategoryRepositoryImpl(
graphQLClient: dependecies.resolve(GraphQLClient.self),
readApiCacheClient: dependecies.resolve(ReadApiCacheClient.self),
backgroundScheduler: dependecies.resolve(ImmediateSchedulerType.self, name: background)
)
)
subscribe(on: backgroundScheduler)
Repository API / GraphQLでの処理なのでサブスレッドで実行
Presenter UIへの取得データ反映処理なのでメインスレッドで実行
observe(on: mainScheduler)
処理内ではこの様に利用する
サブスレッドで処理をする場合は下記を付与
メインスレッドで処理をする場合は下記を付与
- 23. DIコンテナの中で実行する処理のコード例(2)
名前と型による管理をすることで適切な処理を選択する事例(2)
Cacheを利用するか?サーバーとの通信を利用するか適切に指定するために第2引数を活用:
let local = "local"
dependecies.register(
CourseRepository.self,
impl: CourseRepositoryImpl(
graphQLClient: dependecies.resolve(GraphQLClient.self),
readApiCacheClient: dependecies.resolve(ReadApiCacheClient.self),
courseMemoryCache: dependecies.resolve(CourseMemoryCache.self),
backgroundScheduler: dependecies.resolve(ImmediateSchedulerType.self, name: background)
)
)
dependecies.register(
CourseRepository.self,
impl: LocalCourseRepositoryImpl(
readApiCacheClient: dependecies.resolve(ReadApiCacheClient.self),
courseMemoryCache: dependecies.resolve(CourseMemoryCache.self),
backgroundScheduler: dependecies.resolve(ImmediateSchedulerType.self, name: background)
),
name: local
)
サーバーとの通信
Cacheを利用する
localGetCategoryCoursesUseCase:
dependecies.resolve(
GetCategoryCoursesUseCase.self, name: local
)
getCategoryCoursesUseCase:
dependecies.resolve(
GetCategoryCoursesUseCase.self
)
とあるPresenterでの処理例
① まずはCacheからのデータを反映する
② 次にサーバーからのデータを反映する
同じ名前のUseCaseでもデータ取得先が違う