【问题标题】:Improving compile time of long combine chain提高长组合链的编译时间
【发布时间】:2021-07-15 13:49:26
【问题描述】:

我有一个很长的 API 端点列表,我需要按特定顺序依次调用,以使我的应用程序的状态与服务器保持同步。我选择使用组合链来实现这一点。每个操作都会调用一个函数来完成一些工作(读取和写入一些 Core Data 模型)并返回相同的类型,例如:-> 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)

【问题讨论】:

    标签: swift xcode compilation combine


    【解决方案1】:

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

    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)
     ...
    

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 2023-03-24
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 2017-05-25
      • 2014-11-25
      • 2022-11-14
      相关资源
      最近更新 更多