본문 바로가기

개발

RxSwift Observables and Subjects

728x90

RxSwift는 비동기 데이터 스트림을 관리하고 사용자 상호작용을 처리하기 위한 강력한 도구를 제공합니다. Observables와 Subjects는 RxSwift의 기본 개념으로, 데이터를 표현하고 내보내는 다양한 방법을 제공합니다.

1. 관찰 가능한 것:

  • 정의: Observable은 시간이 지남에 따라 방출되는 일련의 값을 나타냅니다. 이는 푸시 기반이며, 즉 값이 구독자에게 비동기적으로 방출됩니다.
  • 생성: Observable은 , , 네트워크 요청 확장과 같은 다양한 방법을 사용하여 생성할 수 있습니다 .Observable.from Observable.create
  • 특징: Observable은 단일 사용 이므로 구독한 후에는 다시 구독할 수 없습니다. 데이터 스트림을 변환, 필터링 및 결합하기 위한 다양한 연산자를 제공합니다 .

2. 과목 :

  • 정의: Subject는 외부 소스에서 값을 수신할 수도 있는 특수한 유형의 Observable입니다. 둘 다 push 기반이고 pull 기반이어서 값을 내보내고 수신할 수 있습니다.
  • 유형: RxSwift는 각각 고유한 동작을 가진 다양한 유형의 Subject를 제공합니다 .
  • 사용법: 주제는 데이터 흐름을 제어하고, 백프레셔를 관리 하거나, 여러 구독을 처리해야 하는 시나리오에 유용합니다.

3. 비교표:

특징 관찰 가능한 과목
가치 방출 푸시 기반 푸시 기반 기반
신청 일회용 여러 구독 허용
가치 접근 새로운 구독자는 후속 값만 받습니다. 새로운 구독자는 이전 값을 받을 있습니다(주제 유형에 따라 다름)
사용 사례 데이터 스트림, 네트워크 요청, 비동기 작업 상태 관리, 이벤트 처리, 백프레셔 제어

4. 고급 예제:

  • 사용자 입력에 대한 디바운싱: 과도한 작업을 방지하려면 연산자를 사용하세요 .throttle
  • 네트워크 요청 처리: Moya와 map연산자를 사용하여 JSON 응답을 구문 분석합니다.
  • 채팅 애플리케이션 구현: 메시지 스트림을 관리하는 데 사용합니다 .messagesSubject
  • 데이터 페이지 분할 시스템 구현: 페이지별 데이터 로딩에 및 를 사용합니다 .pageNumberObservableflatMapLatest
  • 실시간 위치 추적기 구현: CoreLocation을 사용하여 Observable.create위치 업데이트를 추적합니다.

5. 관찰 가능 항목 또는 주제 선택:

  • 관찰 가능 항목: 데이터 흐름을 직접 제어하지 않고 구독자에게 값을 푸시하려는 데이터 스트림에 사용합니다.
  • 주제: 데이터 흐름을 관리하거나 여러 구독을 처리하거나 이전 값에 대한 액세스를 제공해야 하는 시나리오에 사용합니다.

6. 추가 자료:

RxSwift Observables Subjects 반응형 애플리케이션을 구축하고 비동기 데이터를 효율적으로 처리하기 위한 강력한 도구를 제공합니다. 차이점을 이해하고 시나리오에 적합한 도구를 선택하는 것은 효과적이고 유지 관리 가능한 RxSwift 애플리케이션을 개발하는 중요합니다.

 

다음은 RxSwift Observables와 Subjects를 사용하여 일반적인 프로그래밍 작업을 해결하는 방법에 대한 몇 가지 실제 예입니다.

1. 사용자 입력 디바운싱:

  • 문제: 사용자가 버튼을 빠르게 탭할 때 과도한 UI 업데이트나 API 호출을 방지합니다.
  • 해결책: 연산자 를 사용하여 throttle지정된 시간 간격이 경과할 때까지 새 값의 방출을 지연시킵니다.
import RxSwift



let searchTextField = UITextField()



let searchQueryObservable = searchTextField.rx.text.throttle(2, scheduler: SerialDispatchQueueScheduler(qos: .background))

  .distinctUntilChanged()

  .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }



searchQueryObservable.subscribe(onNext: { query in

  print("Search query: \(query)")

  // Perform search based on the query

})

 

  • 설명:

운영자 throttle는 마지막 검색어가 발행된 이후 2초 후에만 새로운 검색어가 발행되도록 보장합니다.
distinctUntilChanged동일한 연속 값을 걸러냅니다.
그런 다음 잘린 쿼리를 사용하여 검색을 수행합니다.

 

2. 네트워크 요청 처리:

  • 문제: API에서 데이터를 가져와 응답으로 UI를 업데이트합니다.
  • 솔루션: RxSwift의 네트워크 요청 확장 기능과 연산자를 사용하여 요청을 만들고, JSON 응답을 구문 분석하고, 오류를 처리합니다.
import RxSwift

import Moya



let provider = MoyaProvider<MyAPI>()



let networkRequestObservable = provider.rx.request(.getUser(id: 123))

  .mapJSON()

  .asObservable()

  .catchErrorJustReturn(Observable.empty())



networkRequestObservable.subscribe(onNext: { user in

  print("User data: \(user)")

  // Update UI with user data

}, onError: { error in

  print("Error: \(error.localizedDescription)")

  // Handle network error

})

 

  • 설명:

provider.rx.request네트워크 요청을 나타내는 Observable을 생성합니다.
mapJSONJSON 응답을 User모델로 구문 분석합니다.
catchErrorJustReturnObservable이 오류로 종료되는 대신 빈 Observable을 방출하도록 보장합니다.
폐쇄 subscribe는 수신된 사용자 데이터나 네트워크 오류를 처리합니다.

 

 

3. 채팅 애플리케이션 구현:

  • 문제: 사용자 간의 실시간 메시지 통신을 관리합니다.
  • 해결책: 채팅 메시지 스트림을 표현하고 구독자에게 새 메시지를 알립니다 .PublishSubject
import RxSwift



let messagesSubject = PublishSubject<Message>()

let currentUser = "Alice"



let messageInputObservable = messageTextField.rx.text

  .map { Message(sender: currentUser, content: $0) }



messageInputObservable.subscribe(onNext: { message in

  messagesSubject.onNext(message)

  // Clear the message input field

})



messagesSubject.subscribe(onNext: { message in

  print("\(message.sender): \(message.content)")

  // Display the message in the chat UI

})

 

  • 설명:

messagesSubject모든 구독자에게 새로운 메시지를 전송하는 것 입니다 .PublishSubject
messageInputObservable사용자 입력을 Message객체로 변환합니다.
클로저 subscribe는 메시지를 추가 messagesSubject하고 입력 필드를 지웁니다.
다른 subscribe폐쇄 장치는 받은 각 메시지를 인쇄하고 표시합니다.

 

 

4. 데이터 페이지 매김 시스템 구현:

  • 문제: 성능과 사용자 경험을 개선하기 위해 데이터를 청크로 로드하세요.
  • 해결책: 를 사용하여 Variable현재 페이지 번호를 나타내고 flatMapLatest요청된 각 페이지에 대한 데이터를 가져옵니다.
import RxSwift



let pageSize = 20



let pageNumberObservable = Variable(1)



let dataRequestObservable = pageNumberObservable

  .flatMapLatest { pageNumber in

    Observable.create { observer in

      // Perform API request to fetch data for the given page

      // Send the fetched data to the observer

    }

  }

  .shareReplay(1)



dataRequestObservable.subscribe(onNext: { data in

  // Append the fetched data to the existing data

  // Update the UI with the new data

})



// Trigger the initial data load

pageNumberObservable.onNext(1)

 

  • 설명:

pageNumberObservable현재 페이지 번호를 추적하는 입니다 .Variable
flatMapLatest이전 데이터 요청을 취소하고 페이지 번호가 변경될 때마다 새로운 Observable을 생성합니다.
블록 Observable.create은 주어진 페이지에 대한 API 요청을 나타냅니다.
shareReplay(1)여러 구독자가 동일한 Observable을 수신하도록 보장합니다.

'개발' 카테고리의 다른 글

RxSwift Transforming Operators  (0) 2024.07.09
RxSwift Filtering Operators  (0) 2024.07.09
RxSwift Subjects  (0) 2024.07.09
RxSwift Observables  (0) 2024.07.09
RXSwift의 요소  (0) 2024.07.09