ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RxSwift] subscribe, next, error, completed
    프로그래밍/Swift 2021. 4. 15. 19:06

    1. subscribe

    여러가지 처리하고 만들어진 Observable 데이터를 받아서 사용할 때 쓰는 키워드.

    Observable = 나중에 생기는 데이터, subscribe = 나중에 생기는 데이터를 꺼내 쓰는것.

    subscribe의 return타입은 disposable임.

    다른 operator들은 return타입이 전부 stream임(Observable)

     

    DisposeBag에 여러 dispose한 것들을 담을 수 있지만 disposeBag.disposed()라는 메서드를 호출 할 수는 없음.

    그래서 disposeBag 변수에 새로운 disposBag를 생성하는 것으로 disposed() 를 하게함.

    subscribe의 반환타입이 disposable이기 때문에, 보통사용할 때 외부의 변수로 생성한 disposableBag에 담는코드를 사용한다고 함. 평소에는 subscribe에서 나온 disposable을 사용할 일은 없지만, 만약에 작업을 취소해야하거나 하는 일이 있다면 disposable을 가지고있다가 적절한 시기에 disposed()를 호출하면 작업이 취소가 됨.

    var disposeBag = DisposeBag()
    
    Observable.just ... 
    			.subscribe { ... }
    	.disposed(by: disposeBag) // disposable을 disposeBag에 담는다
    
    ... 사용후에
    disposeBag.disposed() // X 할수없음
    disposeBag = DisposeBag() // O 새롭게 생성해서 취소시킴

     

     

     

    사용예시 1)

    func example1() {
    	Observable.just("Hello World")
        	.subscribe()	// 그대로 사용하고 stream은 종료. 그냥 실행만 하는 경우
    }

     

    사용예시 2) : 가장 일반적인 사용방법

    // 기본 형태
    func example2() {
    	Observable.just("Hello World")
        	.subscribe(on: (Event<String> -> Void)	// 실행 결과를 받아서 뭔가 처리해야할때
    }

    여기서 event 타입 파라미터 종류가 3가지가 있음 ( next, error, completed )

     

    func example3() {
        Observable.just("Hello World")
            .subscribe( event in
                switch event {
                 case .next(let str):
                    break
                case .error(let error):
                    break
                case .completed:
                    break
                }
            }
    }

     

     

    2. next, error, completed

    next는 데이터가 전달되는 것.

    오류가 발생했을 때 ( marble diagram에서 X표시 )가 error.

    모든 stream이 완료되었을 때 completed.

    error, completed이 되었을 때 stream은 종료가 된다.

     

    // 정상작동하는 상황(completed)
    func example4() {
        Observable.from(["Hello World", 1, 2, 3])
            .subscribe( event in
                switch event {
                 case .next(let str):
                 	print("next: \(str)")
                    break
                case .error(let error):
                	print("error: \(error.localizedDescription)")
                    break
                case .completed:
                	print("completed")
                    break
                }
            }
    }
    
    // next: Hello World
    // next: 1
    // next: 2
    // next: 3
    // completed

     

    위 example4에서는 from연산자가 사용되었으므로 .next가 데이터의 길이인 4번 호출된다.

    그리고 모든 stream이 정상적으로 끝났을 때 .completed이 호출되어 complete가 출력된다.

     

    // 에러가 발생하는 상황(error)
    func example4() {
        Observable.from(["Hello World", 1, 2, 3])
        	.single()
            .subscribe( event in
                switch event {
                 case .next(let str):
                 	print("next: \(str)")
                    break
                case .error(let error):
                	print("error: \(error.localizedDescription)")
                    break
                case .completed:
                	print("completed")
                    break
                }
            }
    }
    
    // next: Hello World
    // The operation couldn't be completed.

    single() 배출된 항목이 단지 하나일 때 사용가능함

    위 코드에서는 from으로 들어온 것(배열)이 ["Hello world", 1, 2, 3]으로 여러개므로 에러가 발생됨.

    실행결과에서도 오류가 발생한 것을 확인할 수 있음.

    error가 발생했을 때는 completed가 작동하지 않음.

    여기서 자주실수하는게 어떤 작업을 끝내는 작업을 completed에서만 해줘서 error가 발생했을 때 작업이 끝나지 않는 상황이 발생한다고함.

     

    반응형

    '프로그래밍 > Swift' 카테고리의 다른 글

    [RxSwift] Operators (scan, window)  (0) 2021.04.16
    [RxSwift] subject  (0) 2021.04.16
    [RxSwift] Operators (just, from, map, filter)  (0) 2021.04.15

    댓글

Designed by Tistory.