[EasyVel] PostsViewModel - Input, Output

final class PostsViewModel: BaseViewModel {
	   
		// ...
    
    // MARK: - Input
    
    struct Input {
        let postTrigger: Observable<Void>
        
        init(_ postTrigger: Observable<Void>) {
            self.postTrigger = postTrigger
        }
    }
    
    struct Output {
        let postList: Driver<[PostModel]>
        let isPostListEmpty: Driver<Bool>
        
        init(_ postList: Driver<[PostModel]>,
             _ isPostListEmpty: Driver<Bool>) {
            self.postList = postList
            self.isPostListEmpty = isPostListEmpty
        }
    }

		// ...
}

Input

Output

[EasyVel] PostsViewModel - transform

final class PostsViewModel: BaseViewModel {
		// ...
	
    // MARK: - Custom Functions
    
    func transform(input: Input) -> Output {
        let postList = input.postTrigger
            .startWith(LoadingView.showLoading())
            .flatMapLatest { _ -> Observable<[PostDTO]?> in
                self.getPosts()
            }
            .map { postDTO -> [PostModel] in
                guard let postDTO = postDTO else {
                    LoadingView.hideLoading()
                    return [PostModel]()
                }
                var postList = postDTO.map { PostModel(id: UUID(), post: $0) }
                LoadingView.hideLoading()
                return postList
            }
            .asDriver(onErrorJustReturn: [])
        
        let isPostListEmpty = postList
            .map { $0.isEmpty }
            .asDriver(onErrorJustReturn: true)
        
        return Output(postList, isPostListEmpty)
    }
}

transform

[EasyVel] PostsViewController - bind

final class PostsViewController: RxBaseViewController<PostsViewModel> {
		// ...		

 	  override func bind(viewModel: PostsViewModel) {
        self.confiugreDataSource()
				
        let viewWillAppear = viewModel.viewWillAppear
            .asObservable()
				// refreshControl 추가할 예정
        
        let input = PostsViewModel.Input(viewWillAppear)
        
        let output = viewModel.transform(input: input)
        
        output.postList.drive(onNext: {
            self.loadSnapshotData(with: $0)
        }).disposed(by: disposeBag)
    }

		// ...
}