[RxSwift]RxSwift Traits

brick·2023년 3월 10일
0

RxSwift

목록 보기
1/2
post-thumbnail

Traits help communicate and ensure observable sequence properties across interface boundaries, as well as provide contextual meaning, syntactical sugar and target more specific use-cases when compared to a raw Observable, which could be used in any context. For that reason, Traits are entirely optional. You are free to use raw Observable sequences everywhere in your program as all core RxSwift/RxCocoa APIs support them.

Trait는 모든 상황에서 사용가능한 Observable과 비교해서 contextual meaning, syntactical sugar 그리고 더 구체적인 use-case를 제공합니다.

✨Single

  • 한개의 element 또는 한개의 error만 방출
  • side effect를 share하지 않습니다.

Single은 주로 HTTP Reqeust에 사용됩니다.

Creating a Single

func getRepo(_ repo: String) -> Single<[String: Any]> {
    return Single<[String: Any]>.create { single in
        let task = URLSession.shared.dataTask(with: URL(string: "https://api.github.com/repos/\(repo)")!) { data, _, error in
            if let error = error {
                single(.failure(error))
                return
            }

            guard let data = data,
                  let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves),
                  let result = json as? [String: Any] else {
                single(.failure(DataError.cantParseJSON))
                return
            }

            single(.success(result))
        }

        task.resume()

        return Disposables.create { task.cancel() }
    }
}

Subscribing a Single

구독은 Swift의 Result enumeration을 사용합니다. 첫번째 event를 방출하면 더이상 event를 방출하지 않습니다.

getRepo("ReactiveX/RxSwift")
    .subscribe { event in
        switch event {
            case .success(let json):
                print("JSON: ", json)
            case .failure(let error):
                print("Error: ", error)
        }
    }
    .disposed(by: disposeBag)
    
    
getRepo("ReactiveX/RxSwift")
    .subscribe(onSuccess: { json in
                   print("JSON: ", json)
               },
               onError: { error in
                   print("Error: ", error)
               })
    .disposed(by: disposeBag)


✨Completable

  • element를 방출하지 않습니다.
  • 한개의 completion 또는 한개의 error만 방출한다.
  • side effect를 share하지 않는다.

Completable은 주로 동작이 complete된 사실만 신경쓸때 사용한다. element를 방출할 수 없는 Observable<Void>와 유사하다.

Creating a Completable

func cacheLocally() -> Completable {
    return Completable.create { completable in
       // Store some data locally
       ...
       ...

       guard success else {
           completable(.error(CacheError.failedCaching))
           return Disposables.create {}
       }

       completable(.completed)
       return Disposables.create {}
    }
}

Subscribing a Completable

구독은 CompletableEvent enumeration을 사용합니다. 첫번째 event를 방출하면 더이상 event를 방출하지 않습니다.

cacheLocally()
    .subscribe { completable in
        switch completable {
            case .completed:
                print("Completed with no error")
            case .error(let error):
                print("Completed with an error: \(error.localizedDescription)")
        }
    }
    .disposed(by: disposeBag)
    
    
cacheLocally()
    .subscribe(onCompleted: {
                   print("Completed with no error")
               },
               onError: { error in
                   print("Completed with an error: \(error.localizedDescription)")
               })
    .disposed(by: disposeBag)
    


✨Maybe

  • completed event, element, error 중 한개만 방출합니다.
  • side effect를 share하지 않는다.

Creating a Maybe

func generateString() -> Maybe<String> {
    return Maybe<String>.create { maybe in
        maybe(.success("RxSwift"))

        // OR

        maybe(.completed)

        // OR

        maybe(.error(error))

        return Disposables.create {}
    }
}

Subscribing a Maybe

generateString()
    .subscribe { maybe in
        switch maybe {
            case .success(let element):
                print("Completed with element \(element)")
            case .completed:
                print("Completed with no element")
            case .error(let error):
                print("Completed with an error \(error.localizedDescription)")
        }
    }
    .disposed(by: disposeBag)
    
    
generateString()
    .subscribe(onSuccess: { element in
                   print("Completed with element \(element)")
               },
               onError: { error in
                   print("Completed with an error \(error.localizedDescription)")
               },
               onCompleted: {
                   print("Completed with no element")
               })
    .disposed(by: disposeBag)

✨참고

0개의 댓글