Ios 对异步任务执行轮询请求
我已经编写了一个Rx查询来在计时器中执行异步任务。这也处理了我需要放弃订单请求的场景,该请求的响应将在稍后出现。这是用C写的:Ios 对异步任务执行轮询请求,ios,swift,swift3,system.reactive,rx-swift,Ios,Swift,Swift3,System.reactive,Rx Swift,我已经编写了一个Rx查询来在计时器中执行异步任务。这也处理了我需要放弃订单请求的场景,该请求的响应将在稍后出现。这是用C写的: public static IObservable<T> PollingAync<T> (Func<Task<T>> AsyncCall, double TimerDuration) { return Observable .Create<T>(o =&
public static IObservable<T> PollingAync<T> (Func<Task<T>> AsyncCall, double TimerDuration)
{
return Observable
.Create<T>(o =>
{
var z = 0L;
return
Observable
.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(TimerDuration))
.SelectMany(nr =>
Observable.FromAsync<T>(AsyncCall),
(nr, obj) => new { nr, obj})
.Do(res => z = Math.Max(z, res.nr))
.Where(res => res.nr >= z)
.Select(res => res.obj)
.Subscribe(o);
});
}
我希望用swift编写相同的实现,它处理异步任务,并丢弃稍后响应的订单请求。我想用swift3.0写这篇文章
由于我是swift新手,请帮助我了解如何在不使用Rx的情况下在swift中获得相同的结果 这是一个有趣的问题
enum Result<T> {
case success(T)
case failure(Error)
}
typealias Cancel = () -> Void
func pollingAsync<T>(asyncCall: @escaping (@escaping (Result<T>) -> Void) -> Cancel, duration: TimeInterval, callback: @escaping (Result<T>) -> Void) -> Cancel {
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: .now(), interval: .milliseconds(Int(duration * 1000)), leeway: .milliseconds(10))
var asyncCallCancel: Cancel? = nil
timer.setEventHandler {
asyncCallCancel?()
asyncCallCancel = asyncCall {
callback($0)
}
}
timer.resume()
return {
asyncCallCancel?()
timer.cancel()
}
}
如果无法跟踪此函数返回的Cancel对象,则无法关闭计时器
以下是RxSwift中的等效代码供参考:
func pollingAsync<T>(asyncCall: @escaping () -> Observable<T>, duration: TimeInterval) -> Observable<Event<T>> {
return Observable<Int>.interval(duration, scheduler: MainScheduler.instance)
.flatMapLatest { _ in
asyncCall().materialize().filter { !$0.isCompleted }
}
}
这是一个有趣的问题要回答
enum Result<T> {
case success(T)
case failure(Error)
}
typealias Cancel = () -> Void
func pollingAsync<T>(asyncCall: @escaping (@escaping (Result<T>) -> Void) -> Cancel, duration: TimeInterval, callback: @escaping (Result<T>) -> Void) -> Cancel {
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: .now(), interval: .milliseconds(Int(duration * 1000)), leeway: .milliseconds(10))
var asyncCallCancel: Cancel? = nil
timer.setEventHandler {
asyncCallCancel?()
asyncCallCancel = asyncCall {
callback($0)
}
}
timer.resume()
return {
asyncCallCancel?()
timer.cancel()
}
}
如果无法跟踪此函数返回的Cancel对象,则无法关闭计时器
以下是RxSwift中的等效代码供参考:
func pollingAsync<T>(asyncCall: @escaping () -> Observable<T>, duration: TimeInterval) -> Observable<Event<T>> {
return Observable<Int>.interval(duration, scheduler: MainScheduler.instance)
.flatMapLatest { _ in
asyncCall().materialize().filter { !$0.isCompleted }
}
}
你为什么不使用Rx?@DanielT。实际上,对于团队来说,Rx是一个全新的概念,这需要一些学习时间。因此,我尽量不介绍任何可能阻碍团队未来发展的东西。好吧,在没有Rx的情况下写这篇文章是非常痛苦的。。。教团队如何使用英语可能更容易。我当然明白你的意思。只是一个简单的问题。您能帮助我理解我们如何处理异步操作吗?异步操作通常有一些形式的回调,比如使用Rx的块。实际上,在C语言中,处理异步操作非常容易,就像处理任务一样。异步调用的基本特征是func asyncCallresult:Result->Void,其中Result的定义是:enum Result{case successT,failureError},但是这样的调用是不可取消的。为什么不使用Rx?@DanielT。实际上,对于团队来说,Rx是一个全新的概念,这需要一些学习时间。因此,我尽量不介绍任何可能阻碍团队未来发展的东西。好吧,在没有Rx的情况下写这篇文章是非常痛苦的。。。教团队如何使用英语可能更容易。我当然明白你的意思。只是一个简单的问题。您能帮助我理解我们如何处理异步操作吗?异步操作通常有一些形式的回调,比如使用Rx的块。实际上,在C语言中,处理异步操作非常容易,就像处理任务一样。异步调用的基本特征是func asyncCallresult:Result->Void,其中Result被定义为:enum Result{case successT,failureError},但是这样的调用是不可取消的。谢谢你的回答。我其实也在努力达到同样的目的。谢谢你的回答。我实际上也在努力实现同样的目标。