no message

This commit is contained in:
Peter
2018-10-16 20:18:17 +03:00
parent 2018787b8f
commit 6ee7fd3297

View File

@@ -28,6 +28,58 @@ public func delay<T, E>(_ timeout: Double, queue: Queue) -> (_ signal: Signal<T,
}
}
public func suspendAwareDelay<T, E>(_ timeout: Double, granularity: Double = 4.0, queue: Queue) -> (_ signal: Signal<T, E>) -> Signal<T, E> {
return { signal in
return Signal<T, E> { subscriber in
let disposable = MetaDisposable()
queue.async {
let beginTimestamp = CFAbsoluteTimeGetCurrent()
let startFinalTimer: () -> Void = {
let finalTimeout = beginTimestamp + timeout - CFAbsoluteTimeGetCurrent()
let timer = Timer(timeout: max(0.0, finalTimeout), repeat: false, completion: {
disposable.set(signal.start(next: { next in
subscriber.putNext(next)
}, error: { error in
subscriber.putError(error)
}, completed: {
subscriber.putCompletion()
}))
}, queue: queue)
disposable.set(ActionDisposable {
queue.async {
timer.invalidate()
}
})
timer.start()
}
var invalidateImpl: (() -> Void)?
let timer = Timer(timeout: granularity, repeat: true, completion: {
let currentTimestamp = CFAbsoluteTimeGetCurrent()
if beginTimestamp + timeout >= currentTimestamp - granularity * 1.1 {
invalidateImpl?()
startFinalTimer()
}
}, queue: queue)
invalidateImpl = {
queue.async {
timer.invalidate()
}
}
disposable.set(ActionDisposable {
invalidateImpl?()
})
timer.start()
}
return disposable
}
}
}
public func timeout<T, E>(_ timeout: Double, queue: Queue, alternate: Signal<T, E>) -> (Signal<T, E>) -> Signal<T, E> {
return { signal in
return Signal<T, E> { subscriber in