mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Signals
This commit is contained in:
parent
08ebdf6f90
commit
75d9f03212
@ -24,7 +24,11 @@ public func |> <T, U>(value: T, function: ((T) -> U)) -> U {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final class SubscriberDisposable<T, E>: Disposable, CustomStringConvertible {
|
private final class SubscriberDisposable<T, E>: Disposable, CustomStringConvertible {
|
||||||
|
#if DEBUG
|
||||||
private weak var subscriber: Subscriber<T, E>?
|
private weak var subscriber: Subscriber<T, E>?
|
||||||
|
#else
|
||||||
|
private var subscriber: Subscriber<T, E>?
|
||||||
|
#endif
|
||||||
|
|
||||||
private var lock = pthread_mutex_t()
|
private var lock = pthread_mutex_t()
|
||||||
private var disposable: Disposable?
|
private var disposable: Disposable?
|
||||||
|
@ -3,10 +3,11 @@ import Foundation
|
|||||||
public func delay<T, E>(_ timeout: Double, queue: Queue) -> (_ signal: Signal<T, E>) -> Signal<T, E> {
|
public func delay<T, E>(_ timeout: Double, queue: Queue) -> (_ signal: Signal<T, E>) -> Signal<T, E> {
|
||||||
return { signal in
|
return { signal in
|
||||||
return Signal<T, E> { subscriber in
|
return Signal<T, E> { subscriber in
|
||||||
let disposable = MetaDisposable()
|
let timerDisposable = MetaDisposable()
|
||||||
|
let runDisposable = MetaDisposable()
|
||||||
queue.async {
|
queue.async {
|
||||||
let timer = Timer(timeout: timeout, repeat: false, completion: {
|
let timer = Timer(timeout: timeout, repeat: false, completion: {
|
||||||
disposable.set(signal.start(next: { next in
|
runDisposable.set(signal.start(next: { next in
|
||||||
subscriber.putNext(next)
|
subscriber.putNext(next)
|
||||||
}, error: { error in
|
}, error: { error in
|
||||||
subscriber.putError(error)
|
subscriber.putError(error)
|
||||||
@ -15,7 +16,7 @@ public func delay<T, E>(_ timeout: Double, queue: Queue) -> (_ signal: Signal<T,
|
|||||||
}))
|
}))
|
||||||
}, queue: queue)
|
}, queue: queue)
|
||||||
|
|
||||||
disposable.set(ActionDisposable {
|
timerDisposable.set(ActionDisposable {
|
||||||
queue.async {
|
queue.async {
|
||||||
timer.invalidate()
|
timer.invalidate()
|
||||||
}
|
}
|
||||||
@ -23,7 +24,10 @@ public func delay<T, E>(_ timeout: Double, queue: Queue) -> (_ signal: Signal<T,
|
|||||||
|
|
||||||
timer.start()
|
timer.start()
|
||||||
}
|
}
|
||||||
return disposable
|
return ActionDisposable {
|
||||||
|
timerDisposable.dispose()
|
||||||
|
runDisposable.dispose()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -31,14 +35,16 @@ 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> {
|
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 in
|
||||||
return Signal<T, E> { subscriber in
|
return Signal<T, E> { subscriber in
|
||||||
let disposable = MetaDisposable()
|
let timerDisposable = MetaDisposable()
|
||||||
|
let runDisposable = MetaDisposable()
|
||||||
|
|
||||||
queue.async {
|
queue.async {
|
||||||
let beginTimestamp = CFAbsoluteTimeGetCurrent()
|
let beginTimestamp = CFAbsoluteTimeGetCurrent()
|
||||||
|
|
||||||
let startFinalTimer: () -> Void = {
|
let startFinalTimer: () -> Void = {
|
||||||
let finalTimeout = beginTimestamp + timeout - CFAbsoluteTimeGetCurrent()
|
let finalTimeout = beginTimestamp + timeout - CFAbsoluteTimeGetCurrent()
|
||||||
let timer = Timer(timeout: max(0.0, finalTimeout), repeat: false, completion: {
|
let timer = Timer(timeout: max(0.0, finalTimeout), repeat: false, completion: {
|
||||||
disposable.set(signal.start(next: { next in
|
runDisposable.set(signal.start(next: { next in
|
||||||
subscriber.putNext(next)
|
subscriber.putNext(next)
|
||||||
}, error: { error in
|
}, error: { error in
|
||||||
subscriber.putError(error)
|
subscriber.putError(error)
|
||||||
@ -46,7 +52,7 @@ public func suspendAwareDelay<T, E>(_ timeout: Double, granularity: Double = 4.0
|
|||||||
subscriber.putCompletion()
|
subscriber.putCompletion()
|
||||||
}))
|
}))
|
||||||
}, queue: queue)
|
}, queue: queue)
|
||||||
disposable.set(ActionDisposable {
|
timerDisposable.set(ActionDisposable {
|
||||||
queue.async {
|
queue.async {
|
||||||
timer.invalidate()
|
timer.invalidate()
|
||||||
}
|
}
|
||||||
@ -72,14 +78,17 @@ public func suspendAwareDelay<T, E>(_ timeout: Double, granularity: Double = 4.0
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
disposable.set(ActionDisposable {
|
timerDisposable.set(ActionDisposable {
|
||||||
invalidateImpl?()
|
invalidateImpl?()
|
||||||
})
|
})
|
||||||
|
|
||||||
timer.start()
|
timer.start()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return disposable
|
return ActionDisposable {
|
||||||
|
timerDisposable.dispose()
|
||||||
|
runDisposable.dispose()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user