mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2026-02-01 16:50:33 +00:00
no message
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user