Ios 对异步任务执行轮询请求

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 =&

我已经编写了一个Rx查询来在计时器中执行异步任务。这也处理了我需要放弃订单请求的场景,该请求的响应将在稍后出现。这是用C写的:

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},但是这样的调用是不可取消的。谢谢你的回答。我其实也在努力达到同样的目的。谢谢你的回答。我实际上也在努力实现同样的目标。