개발/Swift
[Combine] - 1. publisher & subscriber
덤벨로퍼
2022. 11. 13. 16:13
기본적인 Notification publisher - subscribe 구현 이다.
override func viewDidLoad() {
super.viewDidLoad()
let notiName = Notification.Name("Noti")
//publisher 를 생성
let publisher = NotificationCenter.default.publisher(for: notiName)
//구독
let subscribe = publisher.sink { _ in
print("NotiNoti")
}
//이벤트 방출
NotificationCenter.default.post(name: notiName, object: nil)
//구독 취소
subscribe.cancel()
}
Subscriber 구현
sink 가 아니라 subscriber 구현하여 사용하는 방법이다.
Input 타입에 이벤트로 받을 타입을 지정해주고 필요한 메소드를 구현해줘야한다.
enum MyError: Error{
case subscriberError
}
class IntSubscriber: Subscriber {
func receive(subscription: Subscription) {
//구독 할때 호출됨.
//지정해준 만큼만 이벤트를 받을수있다. (demand)
subscription.request(.max(2))
print("Receive \\(subscription)")
}
func receive(_ input: Int) -> Subscribers.Demand {
//값을 받으면 호출된다.
print("Receive input \\(input)")
return .none
}
func receive(completion: Subscribers.Completion<MyError>) {
print("Completed")
}
typealias Input = Int
typealias Failure = MyError
}
////////////////////사용
override func viewDidLoad() {
super.viewDidLoad()
let publisher = [1,2,3,4,5,6,7,8,9].publisher
publisher.subscribe(IntSubscriber()) //max2 이므로 1,2만 받음
}
Subject
let subscriber = IntSubscriber()
let subject = PassthroughSubject<Int,MyError>()
// subject.subscribe(subscriber)
subject.send(1)
subject.send(2)
subject.send(3)
Subject는 publisher 와 동시에 subscription 이 될수있다.
send()를 통해 값을 방출할수있고 subscribe or sink를 동해 구독할수있다.
(subscribe 컴파일 에러가 발생하여 문제를 알아보는중)