改进长组合链的编译时间

Improving compile time of long combine chain

我有一个较长的 API 端点列表,我需要按特定顺序依次调用,以使我的应用程序状态与服务器保持同步。我选择使用 Combine 链来实现它。每个操作调用一个函数来完成一些工作(读取和写入一些核心数据模型)和 returns 相同的类型,例如:-> AnyPublisher<SyncEvent?, Error>

放在一起看起来像这样:

Timer.publish(every: interval, on: .current, in: .common)
  .receive(on: DispatchQueue.global(qos: .background))
  .flatMap(syncEndpointOne)
  .flatMap(syncEndpointTwo)
  .flatMap(syncEndpointThree)
  .flatMap(syncEndpointFour)
  ...

在添加了多个这样的函数之后,Swift 编译器和语言服务器就放弃了并且变得没有响应,它将永远挂起。注释掉单独的行可以验证每一行都没有特别的问题——只是这太复杂了,编译器无法推断和推理。

我如何重写它或为编译器提供更多信息来解决这个问题?

(xcode 12.5.1 和 swift 5.4.2)

所以如果链被拆分成它自己的函数,这最终会编译,例如:

func syncEndpoints(event: SyncUpdate?) -> AnyPublisher<SyncUpdate?, Error> {
  return syncEndpointOne
      .flatMap(syncEndpointTwo)
      .flatMap(syncEndpointThree)
      .flatMap(syncEndpointFour)
      .eraseToAnyPublisher()
}

然后:

Timer.publish(every: interval, on: .current, in: .common)
 .receive(on: DispatchQueue.global(qos: .background))
 .flatMap(syncEndpoints)
 ...