1. Publisher

Publisher 는 값을 발행하는 발행자를 말함. 구독자는 Publisher 가 방출하는 값을 전달받을 수 있음.

import Foundation
import Combine

//publisher
let publisher = [0,1,2,3,4,5].publisher

//subscriber가 구독자가 방출하는 값을 받아 그 중 짝수만을 프린트함
let subscriber = publisher
    .filter {
        $0 % 2 == 0
    }
    .sink { intValue in
        print("\(intValue)")
    }

2. Cancellable

구독을 취소할 수 있는 타입. 컴바인에서 퍼블리셔를 구독하게 되면 Cancellable(혹은 AnyCancellable) 을 반환하며 .cancel() 메서드를 이용하여 언제든 구독을 취소할 수 있음.

import Foundation
import Combine

//매 1초마다 현재 시간을 방출하는 컴바인 타이머
let timer = Timer.publish(every: 1, on: .current, in: .default).autoconnect()

//구독자가 매 초마다 타이머의 값을 프린트함
let timerSubscriber: AnyCancellable = timer.sink { time in
    print(time)
}

//5초 후 구독을 종료함
Task {
    DispatchQueue.global(qos:.default).asyncAfter(deadline: .now() + 5) {
        timerSubscriber.cancel()
        print("Subscription is cancelled.")
    }
}

3. PassthroughSubject

PassthroughSubject의 특징은 아래와 같음.

1. 초기값을 가지지 않음
2. 구독자는 구독한 이후 변경되는 값부터 받아볼 수 있음

import Foundation
import Combine

//PassthroughSubject Publisher로 첫번째 제네릭은 전달할 타입, 두번째는 에러 타입.
let publisher = PassthroughSubject<Int, Never>()

//첫번째 구독자
let subscriber1: AnyCancellable = publisher.sink { integer in
    print("integer1 is: \(integer)")
}

publisher.send(123) //구독자1이 123을 출력

//두번째 구독자
let subscriber2 = publisher.sink { integer in
    print("integer2 is: \(integer)")
}

publisher.send(456) //두 구독자 모두 456을 출력
publisher.send(789) //두 구독자 모두 789를 출력

/*
 위의 순서에 따른 프린트 결과:
 integer1 is: 123
 integer1 is: 456
 integer2 is: 456
 integer1 is: 789
 integer2 is: 789
*/

4. CurrentValueSubject

CurrentValueSubject의 특징은 아래와 같음.

1. 초기값을 가짐
2. 구독자는 구독과 동시에 즉시 값을 전달받을 수 있음
3. 새로운 값을 방출할 때마다 구독자에게 자동으로 알림

import Foundation
import Combine

//PassthroughSubject Publisher로 첫번째 제네릭은 전달할 타입, 두번째는 에러 타입.
let publisher = CurrentValueSubject<Int, Never>(100) //100은 initial value

//첫번째 구독자
let subscriber1: AnyCancellable = publisher.sink { integer in
    print("integer1 is: \(integer)") //초기값 100은 이곳에서 한번만 프린트됨
}

publisher.send(200) //갱신된 값 200을 구독자1이 프린트함

//두번째 구독자
let subscriber2 = publisher.sink { integer in
    print("integer2 is: \(integer)") //구독자 2가 새로 설정된 초기값 200을 프린트함
}

publisher.send(300) //구독자 1,2가 모두 갱신된 값 300을 프린트함

/*
 위의 순서에 따른 프린트 결과:
 integer1 is: 100
 integer1 is: 200
 integer2 is: 200
 integer1 is: 300
 integer2 is: 300
*/

이렇게 써놔야 까먹어도 또 볼수있겠지...


WRITTEN BY
artfrige
베이스 연주는 건강에 좋습니다
,

아 걱정하지 마십시오!
그런 당신을 위해 준비한

.navigationDestination(isPresented: Binding<Bool>, destination: () -> View)

가 있으니까요..
(그리고 당연히 위 메서드는 NavigationStack 안의 View객체 밑에 달아줘야 함..)


WRITTEN BY
artfrige
베이스 연주는 건강에 좋습니다
,


BGR의 기사에 따르면 iOS 4.3에서는 캐리어에 상관없이 모든 아이폰이 개별 핫스팟 기능을 갖게 될 거라고 해. 그리고 우린 버라이즌이 이미 떠벌여 놓은 사실을 알고 있지. 이런 마당에 AT&T는 이제 무슨 말을 할까?

아마 개별 핫스팟 기능은 캐리어 서포트를 필요로 할게 확실해. 무슨소리냐면 AT&T가 개별 핫스팟 기능을 거부할 수도 있다는 거야. 아무튼 개별 핫스팟 기능은 버라이즌이 설명한 대로야. 디바이스 다섯 대 까지 아이폰 3G데이터로 와이파이 핫스팟에 접속시킬 수 있어. BGR에서 취재한 대로라면 iOS 4.3은 아마 3월에 나올 듯 해. 아마도 아이폰 5가 나오기 몇달 전이겠지… 어??!!?!?!!?

업데이트: 좋았어! 아이폰 4.3베타를 보니 개인 핫스팟 기능이 들어 있군.(BGR)

역자 주: 원문에 All iPhones라고 써져 있지만 정작 3Gs에선 안된다고 하니 꿈 깨야지 ㅠㅠ
역자 업데이트: 버라이즌은 퍼스널 핫스팟에 월 $20의 별도 과금을 할 예정이라고.


WRITTEN BY
artfrige
베이스 연주는 건강에 좋습니다
,