首页 > 解决方案 > 如何在组合中安排异步调用的同步序列?

问题描述

我想在我的应用程序中处理一系列网络调用。每个调用都是异步的,flatMap()看起来像是正确的调用。但是,flatMap同时处理所有参数,我需要顺序调用——下一个网络调用只有在前一个网络调用完成后才开始。我查找了 RxSwift答案,但它需要concatMapCombine 没有的运算符。这是我正在尝试做的事情的粗略轮廓,但同时flatMap触发myCalls

Publishers.Sequence(sequence: urls)
  .flatMap { url in
    Publishers.Future<Result, Error> { callback in 
        myCall { data, error in 
            if let data = data {
                callback(.success(data))
            } else if let error = error {
                callback(.failure(error))
            }
        }
    }
  }

标签: iosswiftcombine

解决方案


在操场上尝试了一段时间后,我相信我找到了解决方案,但是如果您有更好的想法,请分享。解决方案是添加maxPublishers参数flatMap并将值设置为max(1)

Publishers.Sequence(sequence: urls)
  .flatMap(maxPublishers: .max(1)) // <<<<--- here
  { url in 
    Publishers.Future<Result, Error> { callback in 
      myCall { data, error in 
        if let data = data {
          callback(.success(data))
        } else if let error = error {
          callback(.failure(error))
        }
      }
    }
  }

推荐阅读