改进长组合链的编译时间
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)
...
我有一个较长的 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)
...