어떻게, 어디서 쓰이는지 간단하게 예시를 위주로 작성했습니다.
Combine
비동기 이벤트들을 커스텀하게 핸들링할 수 있게 하는 것.
let provider = (1...10).publisher
AnyPublisher<String, Error>
@published var temperature: Double
private let cancellable: Cancellable
var bag = Set<AnyCancellable>()
let subject = PassthroughSubject<Int, Never>()
subject
.sink(receiveValue: { value in // receiveValue : 값을 받을 때 실행하는 클로저
print(value)
})
.store(in: &bag)
let future = Future<String, Error> { promise in
promise(.success("BOMS2"))
}
let just = Just<String>("BOMS2")
class Ex: Publisher {
typealias Output = String
typealias Failure = Never
}
let deferred = Deferred<Ex>{ () -> Ex in
return Ex()
}
let empty = Empty<String, Never>()
let failed = Fail<String, Error>(error: NSError(domain: "error", code: -1, userInfo: nil))
let record = Record<String, Error> { recoding in
print(recoding)
recoding.receive("BOM")
recoding.receive("S2")
recoding.receive(completion: .finished)
}
let provider = (1...10).publisher.makeConnectable()
let subscriber = CustomSubscrbier()
publisher.subscribe(subscriber)
let passThroughSubject = PassThroughSubject<Int, Never>()
let anySubscriber = AnySubscriber(passThroughSubject)
class SomeSubscriber: Subscriber {
... 생략 ...
func receive(subscription: Subscription) {
print("구독을 시작합니다.")
subscription.request(.unlimited)
}
... 생략 ...
}
public protocol Subject : AnyObject, Publisher {
func send(_ value: Self.Output)
func send(completion: Subscribers.Completion<Self.Failure>)
func send(subscription: Subscription)
}
let subject = CurretValueSubject<Int, Never>(1)
let subject = PassthroughSubject<String, Never>()
[1,2,3,4,5,6,7,8,9,10].publisher
.subscribe(on:DispatchQueue.main) // 전체 Publisher의 기본 동작을 메인 스레드에서 진행한다.(메인 스레드에서 동작)
.delay(for: 2, scheduler: DispatchQueue.global()) // 백그라운드에서 2초간 delay를 준다. 이때 스레드도 바뀐다.(백그라운드 스레드에서 동작)
.map({"\($0)"}) // Int를 String으로 바꿔준다.(백그라운드 스레드에서 동작)
.receive(on: DispatchQueue.main) // 이후 동작은 메인 스레드에서 진행한다.
.sink(receiveValue: { s in
self.label.text = s // 값을 받아서, label에 세팅한다(메인 스레드에서 동작)
}).store(in: &self.cancelBag)
class ViewModel: ObservableObject {
@Published var models: [Model] = []
init(count: Int) {
for _ in 0..<count {
models.append(Model(id: Int.random(in: 0...100)))
}
}
}
// Rx
let disposeBag = DisposeBag()
Observable.just(1)
.subscribe(onNext: { data in
print(data)
})
.disposed(by: disposeBag)
// Combine
let cancellables = Set<AnyCancellable>()
Just(1)
.sink { data in
print(data)
}
.store(in: &cancellables)
// RxSwift
ObserveOn = It works only downstream
SubscribeOn = It works upstream & downstream
// Combine
receiveOn(on: ) = It works only downstream
Subscribe(on:) = It works only upstream