如何实现串行网络调用队列然后在RxSwift中处理?

时间:2017-09-12 10:40:28

标签: swift rx-swift rx-cocoa

我正在开发一个应用程序,我希望使用RxSwift和RxCocoa实现以下功能

  1. 将包含网址的JSON下载到X个文件
  2. 下载文件1,处理文件1
  3. 下载文件2,处理文件2
  4. 下载文件3,处理文件3
  5. ...等

    这里的关键是在下载下一个文件之前必须完成每个文件的处理。至少必须按顺序执行文件处理的顺序。如果我可以在文件1处理时开始下载文件2,那将是非常棒的,但不是必需的。

    我尝试使用SerialDispatchQueueScheduler来完成这项工作,但由于文件大小不同,每个文件的下载都会在不同时间完成,因此处理代码的启动顺序与我启动时不同下载。

    我可以通过使用NSOperations等轻松实现此功能而不使用Rx,但我希望在此应用中继续使用Rx,因为它是我在此应用中的其他地方使用的。

    下面我已经提供了一些包含一些代码的代码段。为了这个问题,已添加了评论。

    var myButton;
    myButton.addEventListener('click', function (e) {
        productAddToCartForm.submit(this);
        redirectToCart();
    });
    

1 个答案:

答案 0 :(得分:4)

我设法通过使用concatMap运算符而不是

来解决它
            .flatMapWithIndex({ [unowned self] (task, index) in
                return self.fetchDiff(for: task, taskIndex: index, taskCount: tasks.count) // StackOverflow: Downloads a file from a URL
            })

concatMap运算符确保在发出更多信号之前完成第一个observable。我不得不使用一些技巧,因为concatMap没有附带concatMapWithIndex,但它可以工作:)