Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Dùng thư viện RXSWIFT để cải tiến hiệu suất cho dự án iOS của bạn — phần 5
Dùng thư viện RXSWIFT để cải tiến hiệu suất cho dự án iOS của bạn — phần 5
May 20, 2020 · 2 min read
RxCocoa
Trong phần này mình sẽ giới thiệu về RXCocoa vs Binding
RXCocoa : sử dụng RX đã được viết extension sẵn để tương tác với các UI Controls.Mình sẽ giới thiệu 1 số control hay dùng
UIButton : on click
btn.rx.controlEvent(UIControlEvents.touchUpInside).subscribe { (event) in
print("Btn Clicked")
}
btn.rx.tap.bind { (event) in
print("Btn Clicked")
}
UITextfield : text change
tf.rx.text.asObservable().subscribe(onNext: { (text) in
guard let textGet = text else {
return
}
print("Tf change : (textGet)")
})
UIScrollView : bắt event contentOffset change, didScroll.
scrollView.rx.contentOffset.subscribe(onNext: { (point) in
print("Scroll offset : (point)")
})
scrollView.rx.didScroll.subscribe(onNext: { _ in
print("Did scroll : (self.scrollView.contentOffset)")
})
UISlider : value change
slider.rx.value.asObservable().subscribe(onNext: { (value) in
print("Slider change : (value)")
})
UIGesture
let tap = UITapGestureRecognizer()
self.view.addGestureRecognizer(tap)
tap.rx.event.asObservable().subscribe(onNext: { (tapGestures) in
print("Tap Gesture tap")
})
NotificationCenter
NotificationCenter.default.rx.notification(Notification.Name.UIApplicationDidEnterBackground, object: nil).subscribe(onNext: { (noti) in
print("App enter background")
})
Method : đợi trigger các method sẽ phát ra
//Ví dụ trong UIViewController đợi viewDidAppear
self.rx.methodInvoked(#selector(self.viewDidAppear(:))).subscribe(onNext: { (event) in
print("View did Appear")
})
2.Binding : nhận các obserser có value và đổ vào control như tableview, collectionview
TableView
// Tạo 1 model
struct ModelDetail {
var title:String = ""
}
// Register cell
self.table.register(UINib(nibName: "MyCell", bundle: nil), forCellReuseIdentifier: "MyCell")
// Tạo data source
let items = Observable.of([
ModelDetail(title:"Item1"),
ModelDetail(title:"Item2"),
ModelDetail(title:"Item3"),
ModelDetail(title:"Item4")])
// Binding
items.bind(to: self.table.rx.items(cellIdentifier: "MyCell", cellType: MyCell.self)){ (index,model,cell) in
cell.lbl.text = model.title
}.disposed(by: dispose)
Table selected indexPath
// Did Selected Indexpath
self.table.rx.itemSelected.asObservable().subscribe(onNext: { (indexPath) in
print("Row Selected :(indexPath.row)")
})
.disposed(by: dispose)
CollectionView : cũng giống như tableView
// Binding
items.bind(to: collectionView.rx.items) { (collectionView, row, element) in
let indexPath = IndexPath(row: row, section: 0)
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! MyCell
cell.lbl?.text = element.title
return cell
}
.disposed(by: dispose)
// Selected IndexPath
self.collectionView.rx.itemSelected.subscribe(onNext: { (indexPath) in
print("CollectionView Row Selected :(indexPath.row)")
})
.disposed(by: dispose)
Bạn cũng có thể custom delegate, dùng song song với rx
// set delegate
table.rx.setDelegate(self).disposed(by: dispose)
collectionView.rx.setDelegate(self).disposed(by: dispose)
// implement delegate
extension ViewController : UITableViewDelegate {
func tableView( tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
}
extension ViewController : UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
}
}
Bạn có thể thấy dùng rxswift giúp cho chúng ta viết code rất ngắn gọn. Amazing :D. Hãy follow để nhận được những bài viết mới nhất nhé.
Nguồn: https://medium.com/@VincentVuVNG/d%C3%B9ng-th%C6%B0-vi%E1%BB%87n-rxswift-%C4%91%E1%BB%83-c%E1%BA%A3i-ti%E1%BA%BFn-hi%E1%BB%87u-su%E1%BA%A5t-cho-d%E1%BB%B1-%C3%A1n-ios-c%E1%BB%A7a-b%E1%BA%A1n-ph%E1%BA%A7n-5-56470ce79e57

