Publisher

#Combine #Publisher

Just

  • 가장 단순한 형태의 Publisher 입니다. 에러 타입은 항상 Never 입니다.
    Just((0...5))
      .sink { value in
          print(value) // 0...5
      }

 

Future

  • 일반적으로 Publisher의 처리를 sink 라는 구독을 형태로 많이 처리하게 되는데 이 때 클로저를 전달하는 과정에서 콜백 기반의 completion 핸들러를 사용하게 되는데 Futrue를 통하여 더욱 깔끔한 코드 작성이 가능해 집니다.
  let myFuture = Future<Int, Never> { promise in
      promise(.success(10))
  }
  myFuture.sink { value in
      print(value) // 10
  }
  • URLSeesion 이나 Alamofire 등 RestFul 관련 API 비동기 요청시에 해당 요청이 성공했는지, 실패 했는지에 대한 여부를 리턴해주는 예제 입니다.
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
		}
	}

 

Fail

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

 

Empty

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

 

Deferred

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

 

Sequence

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

+ Recent posts