Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive talk

Reactive talk

RAC, ReactiveCocoa, RxCocoa, Rx, RxSwift, MVVM, Data binding.

Agapov Alex

April 28, 2017
Tweet

More Decks by Agapov Alex

Other Decks in Technology

Transcript

  1. Functional Reactive Programming //// Features: // Sequences Observable<T> Single<T> Driver<T>

    // Transformations .zip .map/.flatMap // Bindings .bind(to:)
  2. +/- //// Плюсы: + Меньше кода (функциональность + блоки) +

    Асинхронность + группировка + операции с запросами (как промисы) + Асинхронная обработка ошибок + Реактивный интерфейс (безболезненная синхронизация интерфейса с хранилищем) //// Минусы: - Смена подхода разработки - Смена debug/test подхода (тесты писать надо в любом случае, тут они просто немного другие) - Лишняя зависимость в проекте (спорно, имеет большое коммьюнити и поддержку)
  3. Grand example // Define results with async request let searchResults

    = searchBar.rx.text.orEmpty .throttle(0.3, scheduler: MainScheduler.instance) .distinctUntilChanged() .flatMapLatest { query -> Observable<[Repository]> in if query.isEmpty { return .just([]) } return searchGitHub(query) .catchErrorJustReturn([]) } .observeOn(MainScheduler.instance) // Bind to tableView searchResults .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { (index, repository: Repository, cell) in cell.textLabel?.text = repository.name cell.detailTextLabel?.text = repository.url } .disposed(by: disposeBag)
  4. Common patterns // Delegates self.resultsTableView .rx.contentOffset .map { $0.x }

    .bind(to: self.leftPositionConstraint.rx.constant) // KVO view.rx.observe(CGRect.self, "frame") .subscribe(onNext: { frame in print("Got new frame \(frame)") }) .disposed(by: disposeBag) // Notifications NotificationCenter.default .rx.notification(Notification.Name.UITextViewTextDidBeginEditing, object: myTextView) .map { /*do something with data */ } ...
  5. Data Binding Observable.combineLatest(firstName.rx.text, lastName.rx.text) { $0 + " " +

    $1 } .map { "Greetings, \($0)" } .bind(to: greetingLabel.rx.text) viewModel .rows .bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: Cell.self)) { (tableView, viewModel, cell) in cell.viewModel = viewModel } .disposed(by: disposeBag)
  6. Promises // PromiseKit service.register(for: registation) .then { value -> ()

    in } .catch { err in } // RxSwift service.register(for: registation) .subscribe(onNext: { value in }, onError: { err in }) .addDisposableTo(disposeBag)