RxSwift

2. RxSwift Observable이란?

Daesiker 2021. 9. 2. 16:30
반응형

1.  개요

보통 RxSwift로 프로젝트를 짰다고 하면 RxSwift 프레임워크와 RxCocoa 프레임워크를 사용해서 MVVM 디자인 패턴으로 짜여진 프로젝트를 말한다.

RxSwift는 코드를 새로운 데이터에 반응하며 순차적으로 처리하게 함으로써 비동기 프로그래밍을 쉽게하도록 도와준다. 한마디로 비동기 프로그래밍을 위한 프레임워크이다.

RxCocoa는 RxSwift의 동반 라이브러리로써 UIKit과 Cocoa 프레임워크 기반 개발을 지원하는 모든 클래스를 보유하고 있다. 말 그대로 UI component 요소들을 RxSwift로 만든 함수와 연결시켜주는 것이다.

결론적으로는 2개의 프레임워크를 사용해야하는 것인데 이 2가지를 완벽하게 사용할려면 우선 RxSwift를 이해하는 것이 중요하다.

http://reactivex.io/

 

ReactiveX

CROSS-PLATFORM Available for idiomatic Java, Scala, C#, C++, Clojure, JavaScript, Python, Groovy, JRuby, and others

reactivex.io


2. Observable

Observable은 기존의 swift가 가지고 있는 데이터 타입을 RxSwift가 사용할 수 있게 즉 관찰가능하게 만드는 데이터 타입이다. Int형 데이터를 사용하고 싶으면 Obserbable<Int>를 String형 데이터를 사용하고 싶으면 Observable<String> 이런식으로 Observable안에 데이터 타입을 감싸주면 된다.

Example

String 배열의 데이터를 Observable String타입으로 반환해 주는 메서드이다.

func findErrorToString(items: [String]) -> Observable<String> {
    
    return Observable<String>.create { observer in
        
        for item in items {
            if item == "Error" {
                observer.onError(NSError(domain: "Error!!", code: 0, userInfo: nil))
            }
            observer.onNext(item)
        }
        
        observer.onCompleted()
        
        
        return Disposables.create()
    }
    
}

Observable은 이벤트를 만드는 함수이지 이벤트를 처리하지 않는다. 처리는 Observer가 Observable을 계속 관찰하다가 Observable가 이벤트를 던지면 그 때 이벤트를 처리한다. 이때 이벤트를 처리하는 것을 구독한다라고 표현을 한다.

Observable은 총 3가지의 이벤트를 던져주는데 next, error, complete가 있다.

next는 해당 Observable의 타입에 맞는 값을 observer에게 전달한다. 이 함수에서는 "Error"을 제외한 items 안에 있는 string들을 observer에게 전달한다.

나머지 error와 complete는 해당 Observable의 동작을 멈추고 메모리에서 해제가 된다. 더이상 작동하지 않는 것이다. 함수에서 return과 같은 역할이라고 보면되고 error가 작동하면 error을 리턴하고 종료되고 Complete가 작동하면 아무것도 리턴하지 않고 종료하게 된다.

error나 complete가 발생하면 Disposables.create()를 통해 메모리에서 해제된다.

findErrorToString(items: ["Daesiker", "Git", "Error", "Swift", "RxSwift"])
    .subscribe { event in
        switch event {
        case .next(let value):
            print(value)
        case .error(let error):
            print(error)
        case .completed:
            print("완료")
        }
    }.disposed(by: disposeBag)

Observable이 만든 이벤트를 실제로 처리하는 코드이다. Subscribe를 통해 Observable이 만든 이벤트를 Observer가 처리할 수 있게 도와준다.

Observable이 만든 이벤트를 실제로 처리하는 코드이다. Subscribe를 통해 Observable이 만든 이벤트를 Observer가 처리할 수 있게 도와준다.

Error을 지운 경우

Observable이 만든 이벤트를 실제로 처리하는 코드이다. Subscribe를 통해 Observable이 만든 이벤트를 Observer가 처리할 수 있게 도와준다.


DisposeBag

Observable이 만든 이벤트를 실제로 처리하는 코드이다. Subscribe를 통해 Observable이 만든 이벤트를 Observer가 처리할 수 있게 도와준다.

let disposeBag = DisposeBag()

.disposed(by: disposeBag)

전역변수로 disposeBag을 선언하고 Observable이나 Observer의 마지막 부분에 .disposed(by: disposeBag)을 선언하면 DisposeBag이 메모리 해제를 도와준다.

반응형

'RxSwift' 카테고리의 다른 글

6. RxSwift Relay, Signal, Driver  (0) 2021.10.07
5. RxSwift Subject  (0) 2021.10.03
4. RxSwift Operator(2)  (0) 2021.09.30
3. RxSwift Oporator(1)  (0) 2021.09.07
1. RxSwift란?  (0) 2021.08.23