[swift] RxSwift에서의 비동기 처리

RxSwift는 ReactiveX의 Swift 버전으로, 비동기 처리를 간편하게 할 수 있는 도구입니다. 이번 포스트에서는 RxSwift를 사용하여 비동기 처리를 어떻게 구현하는지 알아보겠습니다.

1. Observable과 Observer

RxSwift에서 비동기 처리를 하는 핵심 개념은 Observable과 Observer입니다. Observable은 비동기적으로 발생하는 이벤트 스트림을 나타내고, Observer는 Observable에서 발생한 이벤트를 받아 처리합니다.

let observable = Observable.just(42)

observable.subscribe { event in
    print(event)
}

위의 코드는 42를 방출하는 Observable을 생성하고, 이를 구독한 Observer를 생성하는 예시입니다. Observer는 이벤트를 받아서 출력합니다.

2. 비동기 작업 처리하기

RxSwift를 사용하여 비동기 작업을 처리하려면, Observable을 생성하고 작업을 하는 중간 연산자들을 활용합니다.

func fetchData() -> Observable<String> {
    return Observable.create { observable in
        // 비동기 작업 수행
        DispatchQueue.global().async {
            let result = performNetworkRequest()
            
            // 결과를 onNext 이벤트로 방출
            observable.onNext(result)
            observable.onCompleted()
        }
        
        return Disposables.create()
    }
}

fetchData()
    .subscribe(onNext: { result in
        print(result)
    })

위의 예시는 fetchData() 함수를 통해 네트워크 작업을 비동기적으로 처리하는 코드입니다. 작업이 완료되면 결과를 onNext 이벤트로 방출하고, Observer가 구독하여 결과를 받아 출력합니다.

3. 에러 처리하기

비동기 작업 중에 오류가 발생할 수도 있는데, RxSwift를 사용하면 이를 간편하게 처리할 수 있습니다.

func fetchData() -> Observable<String> {
    return Observable.create { observable in
        // 비동기 작업 수행
        DispatchQueue.global().async {
            do {
                let result = try performNetworkRequest()
                
                // 결과를 onNext 이벤트로 방출
                observable.onNext(result)
                observable.onCompleted()
            } catch {
                // 오류가 발생하면 onError 이벤트로 방출
                observable.onError(error)
            }
        }
        
        return Disposables.create()
    }
}

fetchData()
    .subscribe(onNext: { result in
        print(result)
    }, onError: { error in
        print("에러 발생: \(error.localizedDescription)")
    })

위의 예시는 fetchData() 함수에서 네트워크 작업을 수행하고, 오류가 발생한 경우에는 onError 이벤트를 방출하여 Observer가 받아 처리하는 코드입니다.

4. 기타 연산자

RxSwift에는 다양한 연산자가 있어서 비동기 처리를 더욱 편리하게 할 수 있습니다. 몇 가지 예시를 보겠습니다.

let numberObservable = Observable.from([1, 2, 3, 4, 5])

numberObservable
    .map { $0 * 2 }
    .filter { $0 % 2 == 0 }
    .debounce(.milliseconds(500), scheduler: MainScheduler.instance)
    .subscribe(onNext: { number in
        print(number)
    })

위의 예시는 [1, 2, 3, 4, 5]라는 배열을 Observable로 생성하고, map, filter, debounce 연산자를 활용하여 변환과 필터링을 수행하는 코드입니다. 최종적으로 변환된 이벤트를 출력합니다.

5. 결론

RxSwift를 사용하면 비동기 처리를 더욱 간결하고 효율적으로 할 수 있습니다. Observable과 Observer를 사용하여 비동기 작업을 처리하고, 다양한 연산자를 활용하여 변환과 필터링을 할 수 있습니다.