Search
Duplicate

Combine - Publishers

Created
2024/01/31 10:44
Tags
Combine

ย Publishers

Publishers์˜ ์—ญํ• ๊ณผ ์ค‘์š”์„ฑ

Publishers๋Š” Combine ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๊ตฌ๋…์ž(Subscriber)๋Š” ์ด๋Ÿฌํ•œ Publishers์— ๊ตฌ๋…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ง•

โ€ข
ํƒ€์ž… ์•ˆ์ „
โ—ฆ
Publishers๋Š” ๋ฐฉ์ถœํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…๊ณผ ์˜ค๋ฅ˜ ํƒ€์ž…์„ ๋ช…์‹œํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ธ๋‹ค.
โ€ข
์กฐํ•ฉ ๊ฐ€๋Šฅ
โ—ฆ
์—ฌ๋Ÿฌ Publishers๋ฅผ ์กฐํ•ฉํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” Operator๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ย Publishers

Publishers

โ€ข
protocol Publisher
โ—ฆ
Publisher ํ”„๋กœํ† ์ฝœ์€ ๊ฐ’์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ตฌ๋…์ž์—๊ฒŒ ๋ฐฉ์ถœํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ค€์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๊ทœ์•ฝ์ด๋‹ค
protocol Publisher<Output, Failure> // Output : Publisher๊ฐ€ ๋ฐฉ์ถœํ•  ๊ฐ’์˜ ํƒ€์ž… // Failure : Publisher๊ฐ€ ๋ฐฉ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฅ˜์˜ ํƒ€์ž…. ์˜ค๋ฅ˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ 'Never' ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค.
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ๋ชจ๋“  Publisher ํƒ€์ž…์˜ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํ”„๋กœํ† ์ฝœ, ์ด ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž…์€ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๊ณ , Combine์˜ ๋‹ค๋ฅธ ํƒ€์ž…๋“ค์ด ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.
โ—ฆ
์ฃผ์š” ๋ฉ”์„œ๋“œ : subscribe(_:) : ๊ตฌ๋…์ž๋ฅผ ๋ฐ›์•„๋“ค์ธ๋‹ค.
โ€ข
enum Publishers
enum Publishers
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ Publisher๋ฅผ ์ƒ์„ฑํ•˜๋Š” factory ๋ฉ”์„œ๋“œ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์—ญํ• ์„ ํ•œ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด Publishers.Sequence ๋Š” ์‹œํ€€์Šค์˜ ์š”์†Œ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” Publisher๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
โ€ข
struct AnyPublisher
@frozen struct AnyPublisher<Output, Failure> where Failure: Error
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ํƒ€์ž… ์†Œ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Publisher์˜ ํƒ€์ž… ์ •๋ณด๋ฅผ ์ˆจ๊ธฐ๋ฉด์„œ. ์–ด๋–ค Publisher์™€๋„ ํ˜ธํ™˜๋  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ Publisher๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ตฌ์ฒด์ ์ธ Publisher ํƒ€์ž…์„ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ ๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
struct Published
@propertyWrapper struct Published<Value>
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ํ”„๋กœํผํ‹ฐ๋ฅผ Observable ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ, ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
โ—ฆ
์‚ฌ์šฉ๋ฒ• : @Published ํ”„๋กœํผํ‹ฐ ๋ž˜ํผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๊ฐ’์˜ ๋ณ€๊ฒฝ์„ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ์ œ)
class Weather { @Published var temperature: Double init(temperature: Double) { self.temperature = temperature } } let weather = Weather(temperature: 20) cancellable = weather.$temperature .sink() { print("Temperature now: \($0)") } weather.temperature = 25 // Prints: // Temperature now: 20.0 // Temperature now: 25.0
Swift
๋ณต์‚ฌ
ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ”„๋กœํผํ‹ฐ์˜ willSet ๋ธ”๋ก์—์„œ Publisheing์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ Subsciber๋Š” ํ”„๋กœํผํ‹ฐ์— ์‹ค์ œ๋กœ ์„ค์ •๋˜๊ธฐ ์ „์— ์ƒˆ ๊ฐ’์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค.
โ€ข
protocol Cancellable
protocoll Cancellable
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ์ž‘์—…์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ๊ตฌ๋…์„ ์ทจ์†Œํ•  ๋•Œ ์‚ฌ์šฉ!
โ—ฆ
์ฃผ์š” ๋ฉ”์„œ๋“œ : cancel() : ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ ์ž‘์—…์„ ์ทจ์†Œํ•œ๋‹ค.
โ€ข
class AnyCancellable
final class AnyCancellable
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : Cancellable ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” ํƒ€์ž… ์†Œ๊ฑฐ ํด๋ž˜์Šค๋กœ, ๊ตฌ๋…์„ ์ทจ์†Œํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
โ—ฆ
AnyCancellable ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋  ๋•Œ ์ž๋™์œผ๋กœ cancel() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
์˜ˆ์ œ)
import Combine // Observable ํด๋ž˜์Šค ์ •์˜ class MyModel { @Published var score = 0 } // Observable ๊ฐ์ฒด ์ƒ์„ฑ let model = MyModel() // ๊ตฌ๋… ์ƒ์„ฑ ๋ฐ ๊ฐ’ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์ฒ˜๋ฆฌ var cancellables = Set<AnyCancellable>() model.$score .sink { newScore in print("Score updated: \(newScore)") } .store(in: &cancellables) // ๊ฐ‘ ๋ณ€๊ฒฝ model.score = 10
Swift
๋ณต์‚ฌ
โ€˜MyModelโ€™ ํด๋ž˜์Šค์— @Published ๋กœ ์„ ์–ธ๋œ score ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค.
model.$score.sink ๋ฅผ ํ†ตํ•ด score ํ”„๋กœํผํ‹ฐ์˜ ๋ณ€ํ™”๋ฅผ ๊ตฌ๋…ํ•˜๊ณ , ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ฝ˜์†”์— ์ถœ๋ ฅํ•œ๋‹ค.
AnyCancellable ์ธ์Šคํ„ด์Šค๋Š” cancellables ์„ธํŠธ์— ์ €์žฅ๋˜์–ด, ๊ตฌ๋…์ด ํ•„์š” ์—†์–ด์ง€๋ฉด ์ž๋™์œผ๋กœ ์ทจ์†Œ๋œ๋‹ค.

ย Convenience Publishers

โ€ข
class Future
โ—ฆ
๋‹จ์ผ ๊ฐ’์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ finishes ๋˜๋Š” fails๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” Publisher
โ—ฆ
๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์ถœํ•˜๋Š” Single-shot Publisher
final class Future<Output, Failure> where Failure: Error
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ํ•˜๋‚˜์˜ ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Publisher์ด๋‹ค. ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜์ค‘์— ๋ฐœํ–‰ํ•œ๋‹ค.
โ—ฆ
ํŠน์ง• : ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ ๋‹จ ํ•œ๋ฒˆ๋งŒ ๊ฒฐ๊ณผ๋ฅผ ๋ฐœํ–‰ํ•œ๋‹ค.
์˜ˆ์ œ) Future ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ํ›„ ๋‹จ์ผ ์š”์†Œ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฒŒ์‹œํ•˜๋Š” ๋ฐฉ๋ฒ•
โ—ฆ
Future ๋Š” ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Result ๋กœ ํ”„๋ผ๋ฏธ์Šค๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํด๋กœ์ €์™€ ํ•จ๊ป˜ ์ดˆ๊ธฐํ™”๋œ๋‹ค. ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ, Future ์˜ ํ•˜๋ฅ˜ ๊ตฌ๋…์ž๋Š” ๊ฒŒ์‹œ ์ŠคํŠธ๋ฆผ์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์š”์†Œ๋ฅผ ๋ฐ›๋Š”๋‹ค. ๊ฒฐ๊ณผ๊ฐ€ ์˜ค๋ฅ˜์ธ ๊ฒฝ์šฐ, ๊ฒŒ์‹œ๋Š” ํ•ด๋‹น ์˜ค๋ฅ˜๋กœ ์ข…๋ฃŒ๋œ๋‹ค.
// ์งง์€ ์ง€์—ฐ ํ›„์— ๋žœ๋ค ์ˆซ์ž๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฒŒ์‹œํ•˜๋Š” 'future'๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• func generateAsyncRandomNumberFromFuture() -> Future<Int, Never> { return Future() { promise in DispatchQueue.main.asyncAfter(deadline: .now() + 2) { let number = Int.random(in: 1...10) promise(.success(number)) } } } // async-await ๋ฒ„์ „ func generateAsyncRandomNumberFromContinuation() async -> Int { return await withCheckedContinuation { continuation in DispatchQueue.main.asyncAfter(deadline: .now() + 2) { let number = Int.random(in 1...10) continuation.resume(returning: number) } } }
Swift
๋ณต์‚ฌ
๊ฒŒ์‹œ๋œ ๊ฐ’์„ ๋ฐ›๊ธฐ ์œ„ํ•ด, Subscriber.Sink Combine ๊ตฌ๋…์ž๋ฅผ ์‚ฌ์šฉ!
cancellable = generateAsyncRandomNumberFromFuture() .sink { number in print("Got random number \(number).") }
Swift
๋ณต์‚ฌ
async-await ๊ตฌ๋ฌธ๊ณผ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด, Future ๋Š” ๋Œ€๊ธฐํ•˜๋Š” ํ˜ธ์ถœ์ž์—๊ฒŒ ๊ฐ’์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” Future ๊ฐ€ ๋‹ค๋ฅธ Publisher ์™€ ๋‹ฌ๋ฆฌ ๋‹จ์ผ ์š”์†Œ๋งŒ์„ ๊ฒŒ์‹œํ•œ๋‹ค๋Š” ์ ์—์„œ ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค. value ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์˜ ํ˜ธ์ถœ ํฌ์ธํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ธ๋‹ค.
// future ์‚ฌ์šฉ ๋ฒ„์ „ let number = await generateAsyncRandomNumberFromFuture().value print("Got random number \(number).") // async-await ๋ฒ„์ „ let asyncRandom = await generateAsyncRandomNumberFromContinuation()
Swift
๋ณต์‚ฌ
์˜ˆ์ œ 2)
import Combine var cancellables = Set<AnyCancellable>() let futurePublisher = Future<String, Error> { promise in DispatchQueue.global().asyncAfter(deadline: .now() + 2) { promise(.success("Future ๊ฒฐ๊ณผ")) } } futurePublisher .sink(receiveCompletion: { completion in switch completion { case .finished: print("์™„๋ฃŒ") case .failure(let error): print("์—๋Ÿฌ ๋ฐœ์ƒ: \(error)") } }, receiveValue: { value in print("๋ฐ›์€ ๊ฐ’: \(value)") }) .store(in: &cancellables)
Swift
๋ณต์‚ฌ
โ€ข
struct Just
โ—ฆ
๊ตฌ๋…์ž๋งˆ๋‹ค ๋‹จ ํ•œ ๋ฒˆ์”ฉ ์ถœ๋ ฅ์„ ๋ฐฉ์ถœํ•œ ํ›„ ์ข…๋ฃŒ๋˜๋Š” ๋ฐœํ–‰์ž
struct Just<Output>
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ๋‹จ์ผ ๊ฐ’์„ ๋ฐœํ–‰ํ•˜๊ณ  ์™„๋ฃŒ๋˜๋Š” Publisher. ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์ œ๊ณต๋œ ๊ฐ’์„ ๊ตฌ๋…์ž์—๊ฒŒ ์ฆ‰์‹œ ๋ฐœํ–‰ํ•œ๋‹ค.
โ—ฆ
ํŠน์ง• : ํ…Œ์ŠคํŠธ๋‚˜ ๋‹จ์ˆœํ•œ ๊ฐ’ ๋ณ€ํ™˜์— ์œ ์šฉํ•˜๋‹ค.
โ€ข
struct Defferred
struct Defferred<DeferredPublisher> where DeferredPublisher: Publisher
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ๊ตฌ๋…์ด ๋ฐœ์ƒํ•  ๋•Œ๊นŒ์ง€ Publisher ์ƒ์„ฑ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” Publisher ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ตฌ๋…์ž๋งˆ๋‹ค ์ƒˆ๋กœ์šด Publisher ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
โ—ฆ
ํŠน์ง• : ์ดˆ๊ธฐํ™” ๋น„์šฉ์ด ํฐ Publisher๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
โ€ข
struct Empty
struct Empty<Output, Failure> where Failure: Error
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ์•„๋ฌด ๊ฐ’๋„ ๋ฐœํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜, ์™„๋ฃŒ๋˜์ง€ ์•Š๋Š” Publisher
โ—ฆ
ํŠน์ง• : ํ…Œ์ŠคํŠธ๋‚˜ ๊ธฐ๋ณธ๊ฐ’ ์—†์ด ๋นˆ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
โ€ข
struct Fail
struct Fail<Output, Failure> where Failure: Error
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ๊ตฌ๋… ์งํ›„์— ์‹คํŒจ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” Publisher์ด๋‹ค. ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ฑฐ๋‚˜ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
โ—ฆ
ํŠน์ง• : ํŠน์ •ํ•œ ์—๋Ÿฌ ํƒ€์ž…์„ ๋ฐœํ–‰ํ•œ๋‹ค.
โ€ข
struct Record
struct Record<Output, Failure> where Failure: Error
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ๋ฏธ๋ฆฌ ์ •์˜๋œ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐœํ–‰ํ•˜๊ณ , ์™„๋ฃŒ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” Publisher์ด๋‹ค. ํ…Œ์ŠคํŠธ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
โ—ฆ
ํŠน์ง• : ๊ณ ์ •๋œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์žฌ์ƒ์‚ฐํ•œ๋‹ค.
โ€ข
protocol ConnectablePublisher
protocol ConnectablePublisher<Output, Failure>: Publisher
Swift
๋ณต์‚ฌ
โ—ฆ
๋ชฉ์  : ๊ตฌ๋…์ž๊ฐ€ ๊ตฌ๋…ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ ๋ฐœํ–‰์„ ์‹œ์ž‘ํ•˜์ง€ ์•Š๋Š” Publisher๋ฅผ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. connect() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ๋ฐ์ดํ„ฐ ๋ฐœํ–‰์„ ์‹œ์ž‘ํ•œ๋‹ค.
โ—ฆ
ํŠน์ง• : ์—ฌ๋Ÿฌ ๊ตฌ๋…์ž๊ฐ€ ๋™์‹œ์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
โ†’ ์ฃผ๋กœ ๋ฉ€ํ‹ฐ์บ์ŠคํŒ…(multicasting) ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.
์˜ˆ์ œ) Just, Empty, Fail
import Combine // Just ์˜ˆ์ œ let justPublisher = Just("Just ๋ฐœํ–‰ ๊ฐ’") justPublisher .sink(receiveValue: { print($0) }) // Just๋Š” ๋‹จ์ผ ๊ฐ’ ๋ฐœํ–‰์— ์‚ฌ์šฉ! // Empty ์˜ˆ์ œ let emptyPublisher = Empty<String, Never>() emptyPublisher .sink(receiveCompletion: { print($0) }, receiveValue: { print($0) }) let failPublisher = Fail<String, Error>(error: NSError(domain: "TestError", code: -1, userInfo: nil)) failPublisher .sink(receiveCompletion: { completion in switch completion { case .finished: print("์™„๋ฃŒ") case .failure(let error): print("์—๋Ÿฌ ๋ฐœ์ƒ: \(error.localizedDescription)") } }, receiveValue: { value in print(value) }) // Empty์™€ Fail์€ ํŠน์ • ์ƒํ™ฉ(๊ฐ’์ด ์—†๊ฑฐ๋‚˜ ์—๋Ÿฌ ๋ฐœ์ƒ)์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.
Swift
๋ณต์‚ฌ
โ€ข
Publishers.Sequence
โ—ฆ
์ด ํผ๋ธ”๋ฆฌ์…”๋Š” ์‹œํ€€์Šค(๋ฐฐ์—ด, ๋ฒ”์œ„ ๋“ฑ)์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, ์‹œํ€€์Šค์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐฉ์ถœํ•œ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฃผ์–ด์ง„ ์‹œํ€€์Šค์— ๋Œ€ํ•ด ๋ฐ˜์‘ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
import Combine // ๋ฐฐ์—ด ์‚ฌ์šฉ ์˜ˆ let numbers = [1, 2, 3, 4, 5] let numbersPublisher = Publisher.Sequence(sequence: numbers) // ๊ตฌ๋… ์ƒ์„ฑ ๋ฐ ๊ฐ’ ์ฒ˜๋ฆฌ let subscription = numbersPublisher .sink( receiveCompletion: { completion in switch completion { case .finished: print("Completed") case .failure(let error): print("Error: \(error)") } }, receiveValue: { value in print("Received value: \(value)") } ) // ๋ฒ”์œ„ ์‚ฌ์šฉ ์˜ˆ let rangePublisher = Publishers.Sequence(sequence: 1...5) // ๊ตฌ๋… ์ƒ์„ฑ ๋ฐ ๊ฐ’ ์ฒ˜๋ฆฌ let rangeSubscription = rangePublisher .sink( receiveCompletion: { completion in print("Range Completed") }, receiveValue: { value in print("Range Received Value: \(value)") } )
Swift
๋ณต์‚ฌ

ย ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ ์ž‘์—…

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Combine์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ๋‚˜ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์„ ์–ธ์ ์œผ๋กœ ์กฐ์ž‘ํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž(Operator)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž

โ€ข
map
โ—ฆ
map์€ ์ŠคํŠธ๋ฆผ์— ํฌํ•จ๋œ ๊ฐ ๊ฐ’์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด ๊ฐ’์œผ๋กœ ๋ฐฉ์ถœํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
let publisher = [1, 2, 3, 4 ,5].publisher publisher .map { $0 * 2 } .sink { print("\($0)", terminator: " ") } // 2 4 6 8 10
Swift
๋ณต์‚ฌ
โ€ข
flatMap
โ—ฆ
flatMap์€ ๊ฐ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ํผ๋ธ”๋ฆฌ์…”๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ƒ์„ฑ๋œ ๋ชจ๋“  ํผ๋ธ”๋ฆฌ์…”์˜ ์ถœ๋ ฅ์„ ๋‹จ์ผ ํผ๋ธ”๋ฆฌ์…”๋กœ ๋ณ‘ํ•ฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒด์ธ์œผ๋กœ ์—ฐ๊ฒฐํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค.

ํ•„ํ„ฐ๋ง ์—ฐ์‚ฐ์ž

โ€ข
filter
โ—ฆ
filter๋Š” ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž๋Š” ๊ฐ’๋งŒ์„ ๋ฐฉ์ถœํ•œ๋‹ค. ์กฐ๊ฑด์— ๋งž์ง€ ์•Š๋Š” ๊ฐ’์€ ๋ฌด์‹œ
publisher .filter { $0 % 2 == 0 } .sink { print("\($0)", terminator: " ") } // 2 4
Swift
๋ณต์‚ฌ