Git Hub
коротко
6 заметок с тегом

RxSwift

RxSwift

18 ноября 2019, 8:46

Содержание

Driver

RxSwift

Driver

18 ноября 2019, 8:20

Дравйвер


классная вещь в RxSwift, позволяет:

  1. Восстанавливаться от ошибок.
  2. Является Observable
  3. Автоматически переводит подписку drive в Main thread, что делает его идеальным для UI
  4. Описывать обработку ошибок внутри, не передавая ошибку по цепочке.


...
asDriver()
       .drive({ value in 
       }) 
 ...
RxSwift

RxSwift кастомная View'ха

7 марта 2019, 4:03

Пишем своё расширение кастомной вьюхи.

import UIKit
import RxSwift
import RxCocoa


class CustomControl: UIControl {
    
    var value: Int = 0 {
        didSet { sendActions(for: .valueChanged)}
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
    }
    
    func toggle() {
        if value == 0 {
            backgroundColor = .green
            value = 1
        } else {
            backgroundColor = .red
            value = 0
        }
    }
    
}

extension Reactive where Base: CustomControl {
    var value: ControlProperty<Int> {
        return base.rx.controlProperty(editingEvents: UIControlEvents.valueChanged, getter: { customView in
            return customView.value
        }, setter: { customView, newValue in
            customView.value = newValue
        })
    }
}

И теперь использовать можно так

customView.rx.value
            .subscribe(onNext: { value in
                print("changed my value -> \(value)")
            })
            .disposed(by: bag)

RxSwift   Swift

RxSwift: создаём реактивное расширение

12 января 2019, 13:34

Расширение

extension Reactive where Base: NSView {
    
    public var alphaValue: ControlProperty<CGFloat> {
        
        let source = self.observeWeakly(CGFloat.self, "alphaValue", options: [.initial, .new])
            .filter { $0 != nil }.map { $0! }
            .takeUntil(deallocated)
        
        let observer = Binder<CGFloat>(base) { control, value in
            control.alphaValue = value
        }
        
        return ControlProperty(values: source, valueSink: observer)
    }
    
}

Применение

подписываемся на изменения переменной

view.rx.alphaValue.subscribe(onNext: { value in
                print("val->", value)
            })
            .disposed(by: disposeBag)

меняем значение по слайдеру

slider.rx.value.subscribe({ [weak self] item in
                let newValue = Int( item.element  ?? 0 )
                self?.view.alphaValue = newValue
            })
         .disposed(by: disposeBag)
RxSwift

RxSwift: Создание реактивной переменной

12 января 2019, 13:22

Код должен быть прозрачным

import RxSwift

Способ 1

Создаём переменную

var hitPoints = Variable<Int>(10)

Изменение значение переменной

card.hitPoints.value = hp

Подписка на изменение

card.hitPoints.asObservable().subscribe(onNext: { [weak self] value in
            print("Your hit points ->", value)
            self?.labelHitPoints.stringValue = "\(value)"
        })
            .disposed(by: bag)

Способ 2

Создаём переменную

var rxMana = BehaviorRelay<Int>(value: 0)

Вешаем обработчик на реактивную переменную

self.rxMana.subscribe(onNext: { value in
            print("Your level mana ->", value)
        })
            .disposed(by: disposeBag)

Ну и где-нить меняем значение переменной

rxMana.accept(newValue)
RxSwift

Маленькая памятка по созданию реактивной переменной

29 сентября 2017, 12:06

Подключаем реактивный свифт

import RxSwift

Создаём «сумку» для мусора, при  деините объекта все ссылки из этой сумки будут корректно зачищены

let bag = DisposeBag()

Инитим переменную и её наблюдатель

var reactiveVariable = Variable<Int>(1)
    var nabludatel = PublishSubject<Int>()

...

reactiveVariable.asObservable()
            .bind(to: nabludatel)
            .disposed(by: bag)
        
        
        nabludatel.asObservable()
            .bind  {
                print("called when changed var  -> \($0)")
            }
            .disposed(by: bag)

Применяем

reactiveVariable.value = 31337
RxSwift   Swift