세상을 더 편리하게
article thumbnail
728x90

잡담

면접관) 컴바인 아세요?

나) 콤바인 타봤습니다.

면접관 ) 아니... Combine....

요새 콤바인이 모르는 사람도 많을 것이다. 하지만 iOS 개발자로서 Combine에 대해서 알아보자.

SwiftUI에 대해서 필수이기에!!

(써놓고 무슨 개그인지 나도 모르겠다.)

Combine

언제나 그랬든 우선 WWDC 소개 영상을 보고오는 것을 추천한다.

Combine이 나온 이유는 데이터의 동기화가 주 목적이다.

그래서 그런지 속속 RxSwift의 빈자리를 대체하고 있다.

예제로 살펴보기

import Combine
import SwiftUI

struct CombineView: View {
    
    var vm = CombineViewModel()
    @State var anyCancellable = Set<AnyCancellable>()
    @State var number = 0
    
    var body: some View {
        VStack {
            Text("\(number)")
                .padding()
            
            Button(action: { vm.number.value += 1
                print(vm.number.value)
            }, label: {
                Text("Button")
            })
            .padding()
            .onAppear {
                vm.number.sink { [self] value in
                    DispatchQueue.main.async {
                        self.number = value
                    }
                }.store(in: &anyCancellable)
            }
            
        }
    }
}
import Combine
import SwiftUI

class CombineViewModel {
    var number = CurrentValueSubject<Int, Never>(5)
}

위 영상을 보면 CombineViewModel에 number가 증가함에 따라서 self.number가 설정됨을 볼 수 있다.

어떻게 이런게 가능할까?

Combine의 핵심은 Publish - subscribe(구독과 출간)이다. (굳이 한글로 하면 이상하다 영어로 이해하자 Publish - subscribe )

구독과 좋아요... 보다는 값의 변화를 탐지하는 것이다.

이제 실제 문서를 보며 하나씩 짚어보자.

CurrentValueSubject란?

하나의 값을 둘러 싸고, 값이 변동 될 때에 출간(publish)하는 객체

우선 이해가 되지 않아도 넘어가자.

View에서 onAppear를 찾아보면 number에 함수 sink 가 붙어있음을 알 수 있다.

sink는 무엇일까?

클로져로 작동되는 subscriber를 붙여주는 함수

Combine의 핵심은 Publish - subscribe이라고 했다.

값이 변동되어서 Publish 되면 Subscriber에서 값을 받아서 변동시켜주는 것이다.

sink는 간단하게 Subscriber를 자동으로 만들어주는 함수인 것이다!

그럼 반환되는 AnyCancellable은 뭐지?

취소될 때 제공된 클로저를 실행하는 유형 지우기 취소 가능한 객체. 

이게 뭔 소리야..?

음 간단하게 이야기해서 나 구독한거 취소할래! 를 할 수 있게 만들어 주는 놈이다.

cancel() 함수를 실행해서 구독을 취소할 수 있다.

그럼 store(in: ) 이 함수는 뭐임??

말 그대로 anyCancellable 이거 어따가 저장할래? Set inout 으로 함수 넣어주면 여기에 저장해줄게 이다.

글이 길어질 것 같으니 다음에 글을 이어서 작성하겠다!

728x90
profile

세상을 더 편리하게

@쵱니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!