gpt4 book ai didi

swift - 如何扁平化 AnyPublisher>?

转载 作者:行者123 更新时间:2023-11-30 10:36:50 24 4
gpt4 key购买 nike

我从 RESTful 服务器加载端点,其中一些端点是多页的。它们由 header 响应中的“x-pages”字段表示。我想创建一个发布者,它将所有页面中的所有对象作为单个数组返回。

最后一个 return 语句存在编译错误。

Cannot convert return expression of type 'AnyPublisher<AnyPublisher<[T], LoadingError>, LoadingError>\' to return type 'AnyPublisher<[T], LoadingError>'

如何解决这个“嵌入式”发布商问题?

import Combine
import Foundation

enum LoadingError: Error {
case url(URLError)
case decode(Error)
case couldNotDetermieLastPageNumber(URL)
}

func multipageDataTaskPublishter<T>(for endpoint: Endpoint) -> AnyPublisher<[T], LoadingError> where T: Decodable {
assert(endpoint.page == 1)
let publisher = URLSession.shared.dataTaskPublisher(for: endpoint.url)
.retry(1)
.mapError { LoadingError.url($0) }
.map { (arg) -> AnyPublisher<[T], LoadingError> in
let (_, response) = arg
guard
let header = response as? HTTPURLResponse,
let xpages = header.value(forHTTPHeaderField: "x-pages"),
let lastPage = Int(xpages)
else {
return Fail(error: LoadingError.couldNotDetermieLastPageNumber(endpoint.url))
.eraseToAnyPublisher()
}

let publishers = (1...lastPage).map { page -> AnyPublisher<[T], LoadingError> in
let next = endpoint.for(page: page)
return URLSession.shared.dataTaskPublisher(for: next.url)
.retry(1)
.mapError { LoadingError.url($0) }
.map { $0.data }
.decode(type: [T].self, decoder: JSONDecoder())
.mapError { LoadingError.decode($0) }
.eraseToAnyPublisher()
}
return Publishers.Sequence(sequence: publishers)
.flatMap { $0 }
.reduce([], +)
.eraseToAnyPublisher()
}
return publisher.eraseToAnyPublisher()
}

我可以在创建多页发布者时立即在防护之后添加一个接收器来读取lastPage值。然后,随着 letpublishers = ... 部分从 map 中向上提升一级,我的 Publishers.Sequence 返回值将是正确的。但这在很多层面上似乎都是错误的。分割执行,不可组合。

此外,我意识到我的实现会加载第一页两次。稍后拆分管道并合并数据有效负载会更好,我想找到该解决方案,但我需要首先解决这个问题。如果这是一个无望的原因,那就这样吧,任何惯用的组合解决方案都将被接受。

最佳答案

这一行.map { (arg) -> AnyPublisher<[T], LoadingError> in需要是 flatMap .

关于swift - 如何扁平化 AnyPublisher<AnyPublisher<>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57814264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com