Swiftui와 비동기 처리를 공부하던 중 Combine이라는 framework를 발견하여 공부하는 내용을 정리해 보려 한다
이곳부터 작성되는 예제는 개발하는 정대리님 유튜브의 예제를 저의 해석을 바탕으로 작성했습니다.
var myIntArrayPublisher: Publishers.Sequence<[Int],Never> = [1,2,3].publisher
myIntArrayPublisher.sink { completion in
switch completion {
case.finished:
print("완료")
case .failure(let error):
print("실패: error : \(error)")
}
} receiveValue: { value in
print("값을 받았습니다. : \(value)")
}
값을 받았습니다. : 1
값을 받았습니다. : 2
값을 받았습니다. : 3
완료
var mySubscriptionSet = Set<AnyCancellable> () // Rx의 DisposeBag 같은느낌
let myNotification = Notification.Name("com.Combine.test")
var myDefaultPublisher = NotificationCenter.default.publisher(for: myNotification)
myDefaultPublisher.sink { completion in
switch completion {
case .finished:
print("완료")
case .failure(let error):
print("실패 error :\(error)")
}
} receiveValue: { value in
print("받은 값: \(value)")
}.store(in: &mySubscriptionSet) // 값의 출력이 끝나면 메모리 할당 해제 swift inout문법 c++의 레퍼런스 참조와 같은 느낌
NotificationCenter.default.post(Notification(name: myNotification))
NotificationCenter.default.post(Notification(name: myNotification))
받은 값: name = com.Combine.test, object = nil, userInfo = nil
받은 값: name = com.Combine.test, object = nil, userInfo = nil
다음은 마지막 예제로 KVO에 대하여 알아보자
class myFirend {
var name = "철수" {
didSet{
print("name - didSet(): ",name)
}
}
}
var myFriend = myFirend()
print("현재이름: \(myFriend.name)")
["영수"].publisher.assign(to: \.name, on: myFriend).store(in: &mySubscriptionSet)
//.publihser 까지는 pbulihser 생성 후 , assign(to: (해당 루트)\ (어떤 변수를 관찰할 것인지) .name ,on :루트 변수)
print("현재이름 2: \(myFriend.name)")
myFriend.name = "민수"
print("현재이름 3: \(myFriend.name)")
현재이름: 철수
name - didSet(): 영수
현재이름 2: 영수
name - didSet(): 민수
현재이름 3: 민수
Rx를 공부했기때문에 이해는 확실히 빨리됬다.
아직까지는 Combine이 훨씬 쉬운 것 같다.