RxSwift/Cocoa - Traits



RxSWIFT/Cocoaが所有するTraitを簡単に紹介
RxSwift
1. Single
Observerableと似ていますが、Singleは無限個数のコミットとは異なり、1つの値またはErrorのみをコミットします.

  • Successは
    [onNext&onCompleted]が追加されたEmit Eventと言えます

  • 応答/エラーのみを返すHTTPリクエスト応答を処理する場合のように、単一要素の応答、エラーを処理する場合に便利です.

  • 基本的にSingleはObservableの変体と見なすこともでき,Observableのオペレータを用いることができる.
  • サンプルコード
    func getRequest(url: String?) -> Single<Bool> {
    // Bool 타입의 Single 생성
    
        return Single<Bool>.create { single in
            
    guard let url = url else {
    
    // 매개변수로 들어온 url 이 nill 일경우 single은 error를 방출한다.
    // 생명주기 종료
                single(.error(NSError.init(domain: "error", code: -1, userInfo: nil)))
                return Disposables.create()
            }
    // 그렇지 않을 경우 if 를 통해서 조건에 맞는 값을 success 할수 있다.
    
            if url == "https://www.google.com" {
                single(.success(true))
            } else {
                single(.success(false))
            }
    
            return Disposables.create()
        }
    }
     
    getRequest(url: ) 
    	.subscribe(onSuccess : { success in 
    }.onError : { error in 
    })
    .disposed(by : disposBag)
    2.Completable

  • 要素は伝達されず、エラー/完了した観測可能な変形のみが伝達されます.

  • 正常に完了したかどうかを知るだけで使用できます.(データベースにデータを格納するかどうかなど)

  • Completableは他のバリエーションと異なり、ObserverableをCompletableに変更することはできません.
  • サンプルコード
    let disposeBag = DisposeBag()
    let completable = Completable.create { event in 
    	let someError = false 
    	if someError {
    		event(.error(Error))
     	}else {
    		event(.completed) 
    	}
    	return Disposables.create { 
    		print(DDD)
    	}
    }
    // 사용
    	completable.subscribe(onCompleted : { 
    		print(Event)  
    	}) { (error) in 
    		print(“error”)
    	},disposed(by: disposBag )
    3. Maybe

  • Success、Completed、Error Eventをコミットします.

  • Elementを送信します.

  • 要素をエクスポートせずに、単一の要素、完全またはエラーをエクスポートすることもできます.

  • キャッシュからデータを取得するために使用します.
  • private let disposeBag = DisposeBag()
        public enum SomeError: Error {
           case genericError(String)
        }
    
        let maybe = Maybe<String>.create { event in
            let dividend = Int.random(in: 20...30)
            let divisor = Int.random(in: 0...5)
                
            if divisor == 0 {
               event(.error(SomeError.genericError("Divisor is 0")))
            } else {
               let value = dividend / divisor
               if value > 5 {
                  event(.success("Number is greater than 5"))
               } else {
                  event(.completed)
               }
            }
            return Disposables.create {
                print("Disposed trait resources")
            }
        }
    
    // 사용
    
        maybe.subscribe(onSuccess: { (value) in
              print("Value is \(value)")
        }, onError: { (err) in
              print("Error is \(err.localizedDescription)")
        }) {
              print("Completed Event")
        }.disposed(by: disposeBag)
    
    RxCocoa
    基本的に、RxcocaはUIを使用するときにコードを簡単に直感的に記述することができる.
    ココアの特徴には共通点がたくさんあります.

  • エラーは転送されません.

  • MainSchedulerで購読します.

  • 信号共有なし
  • Driver
  • ドライブにエラーはありません(Emit X)
  • MainScheduler.
  • 共有
  • Share.
  • Driverは、id、pwなどの入力に応じてUIを動的に変更する必要がある場合に適しています.
           let idVaild = idTF.rx.text.orEmpty.map(idCheck(_:))
            let pwVaild = pwTF.rx.text.orEmpty.map(pwCheck(_:))
            
    //        Observable.combineLatest(idVaild, pwVaild) { $0 && $1 }
    //        .observe(on: MainScheduler.instance)
    //        .catchAndReturn(false)
    //        // completd / dispose 났을경우 처리를 못하기위해 작성되는 코드
    //        .materialize() // completd / dispose 를 무시
    //        .dematerialize()
    //        .subscribe(onNext: {
    //            print($0)
    //        }).disposed(by: disposeBag)
            
            Observable.combineLatest(idVaild, pwVaild) { $0 && $1 }
            .asDriver(onErrorJustReturn: false) // completd / error 무시
            .drive(onNext: { // MainThread 로 변경됨
                print($0)
            }).disposed(by: disposeBag)
    長いコードはDriverに大幅に減少しました.
    Signal
    Driverに似ています.
  • 漏電なし
  • MainSchedulerで実行します.
  • Observerにはプレイしません.
  • Subscribe以降EMIT活動を受ける.
  • public func asSignal(onErrorRecover: @escaping (_ error: Swift.Error) -> Signal<Element>) -> Signal<Element> {
            let source = self
                .asObservable()
                .observeOn(SignalSharingStrategy.scheduler)
                .catchError { error in
                    onErrorRecover(error).asObservable()
                }
            return Signal(source)
        }
    ControlEvent

  • 決して失敗しない.

  • Subscriberに秒針を送信しません.

  • ベースが解放されたときに完了します.

  • Main schedulerは購読を保証します.(subscribeOn(ConcurrentMainScheduler.instance))

  • MainScheduler.instance イベントが転送されます.
    ControlProperty

  • UI要素の属性を表します.

  • 失敗はありません.

  • Share(再放送:1)のように行動します.

  • プライマリ・スケジューラで購読します.