###### tags: `Learning Note` ReactiveX Swift 使用筆記 === ### Create Observable * 1. 直接建立序列 ```swift= Observable<T>.create{ observer -> Disposable in observer.onNext(T) observer.onCompleted() // oncompleted need handle .onComplete return Disposables.create() } ``` * 2. just ```swift= Observable.just(T) ``` * 3. of ```swift= Observable.of("a", "b", "c") ``` ### Bind * ForUIImage ```swift= let image: Observable<UIImage> = Observable.create { (observer) -> Disposable in observer.onNext( { () -> UIImage in // url is Images' URL let read_data: Data = try! Data(contentsOf: url!) return UIImage(data: read_data)! }() ) observer.onCompleted() return Disposables.create() } image.bind(to: cell.img_view.rx.image).disposed(by: cell.disposeBag) ``` * For UIRefreshControl (UICollectionView) ```swift= refreshControl.rx.controlEvent(.valueChanged).bind{ (_) in debugPrint("refresh") // somthing to do // Refresh End self.refreshControl.endRefreshing() // Reload Data self.collectview.reloadData() } ``` * For some boolean value ```swift= let observable = Observable<Bool>.of(true, false, true) let button = UIButton() observable.bind(to: button.rx.isEnable).disposed(by: disposeBag) let image = UIImage() observable.map{ !$0 }.bind(to: button.rx.isHidden).disposed(by: disposeBag) ``` ### Subscribe * For Observable #### Observalbe.subscribe() ```swift= Observable.of("a", "b", "c") .subscribe(onNext: { element in debugPrint(element) } ) .disposed(by: disposeBag) ``` * For UIbutton ```swift= button.rx.tap .subscribe(onNext: { [self] in // or [weak self] in // something to do } ) .disposed(by: disposeBag) ``` ### RxDataSource * UICollectionView ```swift= struct CustomSection { var header: String var items: [Item] } extension CustomSection : SectionModelType { typealias Item = T // Custom class var identity: String { return header } init(original: CustomSection, items: [Item]) { self = original self.items = items } } ``` ```swift= // In viewDidLoad() let items = Observable.just( [CustomSection(header: "", items: [T])] ) let dataSource = RxCollectionViewSectionedReloadDataSource <CustomSection>( configureCell: { (dataSource, collectionView, indexPath, element) in let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! customCollectCell return cell } ) items.bind(to: collectview.rx.items(dataSource: dataSource)) .disposed(by: disposeBag) ``` * Cell selected ```siwft= collectview.rx.itemSelected .subscribe(onNext: { [self] indexPath in if(self.mode == .Edit){ if ((self.arrSelectedIndex.contains(indexPath))) { self.arrSelectedIndex = (self.arrSelectedIndex.filter { $0 != indexPath}) } else { self.arrSelectedIndex.append(indexPath) } self.collectview.reloadData() } }) .disposed(by: disposeBag) // Item selected ``` ### Observable variable * PublishSubject 不需有初始值 ```swfit= var boolSubject = PublishSubject<Bool>() ```` * BehaviorSubject 需有初始值 ```swfit= var boolSubject = BehaviorSubject<Bool>(value: true) ```` * 產生Event ```swift= var boolSubject = PublishSubject<Bool>() boolSubject.onNext(true) boolSubject.onNext(false) boolSubject.onCompleted() ``` * 觀察 ```swift= var boolSubject = PublishSubject<Bool>() boolSubject.subscribe(onNext: { _ in }).disposed(by: disposeBag) ```