지난 게시물에 이어서 ReactorKit 예제 Github Search의 ViewController 부분에 대해 설명하겠습니다.
searchController.searchBar.rx.text
.throttle(.milliseconds(300), scheduler: MainScheduler.instance)
.map {Reactor.Action.updateQuery($0)}
.bind(to: reactor.action)
.disposed(by: disposeBag)
tableView.rx.contentOffset
.filter{ [weak self] offset in
guard let self = self else { return false }
guard self.tableView.frame.height > 0 else { return false }
return offset.y + self.tableView.frame.height >= self.tableView.contentSize.height - 100
} //사용자가 더 많은 정보를 원한다면
.map { _ in Reactor.Action.loadNextPage }
.bind(to: reactor.action)
.disposed(by: disposeBag)
reactor.state.map { $0.repos }
.bind(to: tableView.rx.items(cellIdentifier: "cell")) { indexPath, repo, cell in
cell.textLabel?.text = repo.full_name
}
.disposed(by: disposeBag)
reactor의 state를 tableView에 바인딩해주는 작업
tableView.rx.itemSelected
.subscribe(onNext: {[weak self, weak reactor] indexpath in
guard let self = self else { return }
self.view.endEditing(true)
self.tableView.deselectRow(at: indexpath, animated: false)
guard let repo = reactor?.currentState.repos[indexpath.row] else {return}
guard let url = URL(string: "https://github.com/\(repo.full_name)") else { return }
let viewController = SFSafariViewController(url: url)
self.searchController.present(viewController, animated: true, completion: nil)
})
.disposed(by: disposeBag)
cell 선택 시 해당하는 github의 repository로 이동
SafariServices 라이브러리를 통해 웹 페이지 열기
이렇게 간단하게 bind 부분을 요약해보았습니다.
확실히 정리해서 다시 보니 모르고 넘겼던 부분도 다시 보게 되고 한 눈에 코드들이 보여서
나중에 다시 공부할 때 보기 좋을 것 같습니다.