Thread
ν΄λμ€λ₯Ό μ¬μ©νλ λ©μΈ μ€λ λμ μ§μ μμ±ν μ€λ λλRunLoop
λ₯Ό κ°μ§ μ μλ€.- νμ¬ μ€λ λμμ
RunLoop.current
λ₯Ό νΈμΆνλ©΄, Foundation μ΄ μμ± ν΄ μ€ κ²μ΄λ€.
Note :
RunLoop
ν΄λμ€λ thread-safe νμ§ μλ€. νμ¬ μ€λ λμ run loop μμλ§RunLoop
λ©μλλ₯Ό νΈμΆν΄μΌ νλ€.
RunLoop
λ Scheduler
νλ‘ν μ½μ ꡬννλ€. low-level μ κ΄λ ¨λ λ©μλλ₯Ό μ μνκ³ , cancellable νμ΄λ¨Έ μμ±ν μ μλ νλκ° μλ€.
let runLoop = RunLoop.main
let subscription = runLoop.schedule(
after: runLoop.new,
interval: .seconds(1),
tolerance: .milliseconds(100)
) {
print("Timer fired")
}
νμ΄λ¨Έλ μ΄λ€ κ°λ μ λ¬νμ§ μκ³ publisher λ₯Ό μμ±νμ§λ μλλ€.
Combine κ³Ό κ΄λ ¨ν΄μ, μ μΌν μ μ©ν μ μ Cancellable
μ ν΅ν΄ μ μλμ νμ΄λ¨Έλ₯Ό λ©μΆ μ μκ² ν΄μ€λ€.
runLoop.schedule(after: .init(Date(timeIntervalSinceNow: 3.0))) {
cancellable.cancel()
}
νμ§λ§ RunLoop
λ νμ΄λ¨Έλ₯Ό μμ±νλ μ’μ λ°©λ²μ΄ μλλ€. Timer
ν΄λμ€λ₯Ό μ¬μ©νλκ² λ λ«λ€!
Combine μμλ boilerplate μμ΄λ publisher λ‘ λ°λ‘ μ¬μ© ν μ μλ€.
let publisher = Timer.publish(every: 1.0, on: .main, in: .common)
RunLoop.current
λ₯Ό νΈμΆνλ©΄ μ§μ μμ±νκ±°λ Foundation μμ μ»μ μ€λ λμμλ RunLoop
λ₯Ό μ»μ μ μλ€.
let publisher = Timer.publish(every: 1.0, on: .current, in: .common)
Note : μ΄ μ½λλ₯Ό
DispatchQueue.main
μ΄μΈμ Dispatch queue μμ μ€ννλ©΄ μμΈ‘νμ§ λͺ»ν κ²°κ³Όκ° λ°μν μ μλ€. Dispatch νλ μμν¬λ run loop μ μ¬μ©νμ§ μκ³ μ€λ λλ₯Ό κ΄λ¦¬νλ€. run loop μ΄run
λ©μλκ° νλ‘μΈμ€ μ΄λ²€νΈμμ νΈμΆλκΈ°λ₯Ό μꡬ νκΈ° λλ¬Έμ, main μ΄μΈμ λ€λ₯Έ queue μμ νμ΄λ¨Έκ° μ’ λ£λλ κ²μ λ³Ό μ μμ κ²μ΄λ€. μμ νκ²RunLoop.main
μ νμ΄λ¨Έμκ²λ§ νκ²μ κ±Έμ΄μΌ νλ€.
ConnectablePublisher
- νμ΄λ¨Έκ° 리ν΄νλ publisher
connect()
λ©μλλ₯Ό νΈμΆ νκΈ° μ κΉμ§ subscription μμ μμ νμ§ μλPublishr
λ³μautoconnect()
operator λ₯Ό μ¬μ©ν΄μ μ²μ subscriber κ° κ΅¬λ νμ λ μλμΌλ‘ μ°κ²° ν μ μλ€.- publisher λ₯Ό μμ±νλ κ°μ₯ μ’μ λ°©λ²μ subscription μ νμ΄λ¨Έλ₯Ό μμ νλκ²
let publisher = Timer
.publish(ever: 1.0, on: .main, in: .common)
.autoconnect()
μ΄ νμ΄λ¨Έλ λ°λ³΅μ μΌλ‘ νμ¬ λ μ§λ₯Ό emit , Publisher.Output
νμ
μ Date
scan
operator λ₯Ό μ¬μ©ν΄μ νμ΄λ¨Έκ° μ¦κ°νλ κ°μ emit νκ² ν μ μλ€.
let subscription = Timer
.publish(every: 1.0, on: .main, in: .common)
.autoconnect()
.scan(0) { counter, _ in counter + 1 }
.sink { counter in
print("Counter is \(counter)")
}
- dispatch queue λ₯Ό μ¬μ©ν΄ νμ΄λ¨Έ μ΄λ²€νΈλ₯Ό λ°μμν€κΈ° μν΄ μ μλ€.
let queue = DispatchQueue.main
let source = PassthroughSubject<Int, Never>()
var counter = 0
let cancellable = queue.scheule(
after: queue.now,
interval: .seconds(1)
) {
source.send(counter)
counter += 1
}
let subscription = source.sink {
print("Timer emitted \($0)")
}
RunLoop
ν΄λμ€λ‘ νμ΄λ¨Έλ₯Ό μμ± νλ κ²μ Objective-C μ μ€λλ λ°©μμ΄λ€.Timer.publish
λ‘ μ§μ λRunLoop
μμ μ§μ λ κ°κ²©λ§λ€ κ°μ μμ±νλ publisher λ₯Ό μ»κΈ° μν΄ μ¬μ©νλ€.DispatchQueue.schedule
λ dispatch queue μμ μ΄λ²€νΈλ₯Ό emit νλ νμ΄λ¨Έμ΄λ€.