// Basic CombineLatest
let strPublisher = PassthroughSubject<String, Never>()
let numPublisher = PassthroughSubject<Int, Never>()
/* Publishers.combineLatest(strPublisher, numPublisher).sink(receiveValue: { (str, num) in
print("Receive: \(str), \(num)")
}*/ //(지금 보면 위에꺼는 두개 한꺼번에 묶어줬고, 밑에꺼는 strPublisher에 붙여줬는데 결국 똑같은거임!)
strPublisher.combineLatest(numPublisher).sink { (str, num) in
print("Receive: \(str), \(num)")
}
strPublisher.send("a")
strPublisher.send("b")
strPublisher.send("c")
numPublisher.send(1)
numPublisher.send(2)
numPublisher.send(3)
// Advanced CombineLatest
let usernamePublisher = PassthroughSubject<String, Never>()
let passwordPublisher = PassthroughSubject<String, Never>()
let validatedCredentialsSubscription = usernamePublisher.combineLatest( passwordPublisher)
.map { (username, password) -> Bool in
return !username.isEmpty && !password.isEmpty && password.count > 12
}
.sink { valid in
print("Credential valid? : \(valid)")
}
usernamePublisher.send("jasonLee")
passwordPublisher.send("weakpw")
passwordPublisher.send("verystrongpassword")
// Merge
let publisher1 = [1, 2, 3, 4, 5].publisher
let publisher2 = [300, 400, 500].publisher
let mergePublisherSubscription = publisher1.merge(with: publisher2)
.sink { value in
print("Merge: subscription received value: \(value)")
}
예시처럼 Merge는 두 퍼블리셔 값 타입이 같아야 가능!