Combine 개념 정리

yongbeom kwak·2022년 7월 24일
1

Combine

목록 보기
1/5

Swiftui와 비동기 처리를 공부하던 중 Combine이라는 framework를 발견하여 공부하는 내용을 정리해 보려 한다

Combine이란?

Combine OverVeiw
출처:애플공식 사이트

🔥 정의: 이벤트 처리 연산자를 통해 비동기 이벤트 처리하는 프레임워크

기본 구성 요소

1. Publisher 프로토콜
  • 시간에 따라 값의 흐름을 전달할 수 있는 프로토콜
  • publisher는 값을 받아 처리하고 다시 전달하는 연사자를 갖는다
  • publisher는 subscriber가 요청한 경우에만 값을 보낸다.
  • publiser의 리턴 타입은 <Output,Error> 이다
2. Subscriber
  • publishers체인의 끝에서, 값을 수신받을 때 동작한다
  • sink 함수를 이용하여 해당 publisher를 구독한다
  • assign 함수를 통하여 KVO를 구현 가능

실습

이곳부터 작성되는 예제는 개발하는 정대리님 유튜브의 예제를 저의 해석을 바탕으로 작성했습니다.

1) 예제
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) 결과
값을 받았습니다. : 1
값을 받았습니다. : 2
값을 받았습니다. : 3
완료
2) 예제

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))
2) 결과
받은 값: name = com.Combine.test, object = nil, userInfo = nil
받은 값: name = com.Combine.test, object = nil, userInfo = nil
2) 설명
  1. NotificationCenter 역시 Combine을 사용하여 구현되어 같은 방식으로 사용할 수 있음

다음은 마지막 예제로 KVO에 대하여 알아보자

3) 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)")
3)결과
현재이름: 철수
name - didSet():  영수
현재이름 2: 영수
name - didSet():  민수
현재이름 3: 민수

정리

Rx를 공부했기때문에 이해는 확실히 빨리됬다.
아직까지는 Combine이 훨씬 쉬운 것 같다.

profile
IOS개발 공부생

0개의 댓글