티스토리 뷰

iOS/Swift

[Swift] Combine - Publisher

HarryJeonn 2022. 6. 7. 18:17

Why ?


  • 알고 사용하기 위해서 하나씩 정리해보고 맛보려고한다.
  • Combine 핵심 프로토콜 중 Publisher에 대해 정리해보자.

Publisher 종류


  • Just - 가장 단순한 형태의 Publisher로 에러타입으로 Never를 갖는다.
  • Promise - Just와 비슷하지만 Filter Type을 정의할 수 있다.
  • Fail - 정의된 실패타입을 내보낸다.
  • Empty - 어떤 데이터도 발행하지 않는 Publisher로 주로 에러처리나 Optional값을 처리할 때 사용된다.
  • Sequence - 데이터를 순차적으로 발행하는 Publisher로 (1..10).Publisher로 이에 해당한다.
  • ObservableObjectPublisher - SwiftUI에서 사용되는 ObservableObject를 준수하는 Publisher이다.

Just


let _ = Just(5)                   // 1
    .map { value -> String in     // 2
        return "a string"
    }
    .sink { receivedValue in      // 3
        print("The end result was \\(receivedValue)")
    }
  • Just를 사용한 간단한 Combine 파이프 라인
  • 에러타입은 항상 Never이다.

Future


let myFuture = Future<Int, Never> { promise in
      promise(.success(10))
  }
  myFuture.sink { value in
      print(value) // 10
  }
  • Publisher의 처리를 sink로 많이 처리하게 되는데 이 때 클로저를 전달하는 과정에서 콜백 기반의 completion handler를 사용하게 되는데 Future를 통하여 더욱 깔끔한 코드 작성이 가능해진다.
func isSuccessAPIRequest() -> AnyPublisher<Bool, Never> { 
    Future<Bool, Never> { promise in 
        urlRequestPublisher
            .sink(
                receiveCompletion: { completion in 
                    switch completion {
                    case .finished: 
                        print("finished")
                        promise(.success(true))
                    case .failure(let error): print(error.localizedDescription)
                        promise(.success(false))
                    }
                }, receiveValue: { value in
                    print(value)
                }
            )
    }
    .eraseToAnyPublisher()
}

isSuccessAPIRequest()
	.sink { 
		if $0 {
			// true
		} else {
			// false
		}
	}
  • URLSession이나 Alamofire 등 RESTFul 관련 API 비동기 요청시에 해당 요청이 성공했는지, 실패 했는지에 대한 여부를 리턴해주는 예제이다.

Fail


  • 지정한 종류의 에러로 즉시 종료하는 Publisher이다.

Empty


Empty<String, Never>()
      .sink(
          receiveCompletion: { 
              print($0) // finished
          },
          receiveValue: {
              print("receiveValue : \\($0)") // 출력 안함
          }
      )
  • 값을 게시하지 않고 선택적으로 즉시 완료되는 Publisher이다.

Deferred


Deferred { Just(Void()) }
	.sink(receiveValue: { print("Diferred") })
  • 구독이 일어나기 전까지 대기상태로 있다가 구독이 일어났을 때 Publisher가 결정된다.
  • 클로저 안에는 지연실행 할 Publisher를 반환한다.

Sequence


Publishers.Sequence<[Int], Never>(sequence: [1, 2, 3])
    .sink(receiveValue: { 
        print("Sequence : \\($0)")
    })
  • 요소의 주어진 Sequence를 반환하는 Publisher이다.
  • Publisher가 Sequence에 있는 요소들을 하나하나 제공해주며 모든 요소들이 다 제공되었을 때 종료된다.

Reference

https://todayssky.tistory.com/17?category=984240 

 

Swift - Combine의 Publisher 알아보기 Just, Future, Fail, Empty, Deferred, Sequence

Publisher #Combine #Publisher Just 가장 단순한 형태의 Publisher 입니다. 에러 타입은 항상 Never 입니다. Just((0...5)) .sink { value in print(value) // 0...5 } Future 일반적으로 Publisher의 처리를 sin..

todayssky.tistory.com

 

'iOS > Swift' 카테고리의 다른 글

[Swift] Class와 Struct의 차이  (0) 2022.11.09
[Swift] extension과 상속의 차이  (0) 2022.11.09
[Swift] Combine - Scheduler  (0) 2022.06.07
[Swift] Combine - Subject  (0) 2022.06.07
[Swift] Combine  (0) 2022.06.07
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함