본문 바로가기

프로그래밍/iOS,macOS

[Combine] 콜백 기반 여러 처리 결과를 배열로 받기

특정 키로 콜백 기반 api를 여러번 호출한 다음에 해당 결과들을 모아 배열로 받으려 한다.

콜백 호출 함수

구독시 결정되도록 Deferred를 리턴하고, 콜백을 반환하는 함수의 호출 결과를 얻기위해 단일 퍼블리셔인 Future로 구성
에러가 필요 없는 경우 예외에 대해 success("") 로 리턴.

func getSomeValue(id: String) -> AnyPublisher<String, Never> {
   return Deferred {
      Future<String, Never> { [weak self] promise in
         guard let self = self else {
            return promise(.success("")
         }
         
         self.someAsyncMethod(id: id) { result in
            return promise(.success(result))
         }
   }.eraseToAnyPublisher()
}

 

메인 함수

입력 배열을각각의 publisher로 변경하고,  Publisher.MergeMany 를 통해 단일 스트림으로 변경
각 스트림을 collect로 합쳐서 배열로 반환

func getAllValues(ids:[String]) {
   Publishers.MergeMany(ids.map { getValue(id: $0) })
      .collect()
      .receive(on: DispatchQueue.main)
      .sink { values in
          print("results:\(values)")
      }
      .store(in: &cancelBag)
}