【发布时间】:2020-05-12 13:55:22
【问题描述】:
在下面的代码中,一个app对象数组用于创建一个发布者数组,这些发布者被合并到一个发布对象数组中。
apps.map { latestRelease(app: $0) }.merge()
这是最新版本的完成方式。
func latestRelease(app: App) -> AnyPublisher<Release, Error> {
do {
let request = try requestFactory.make(.get, "apps/\(app.owner.name)/\(app.name)/releases/latest")
return publisherFactory.make(for: request)
.mapError{ $0 as Error }
.map { data, _ in data }
.decode(type: Release.self, decoder: decoder)
.eraseToAnyPublisher()
} catch {
return Fail(error: error)
.eraseToAnyPublisher()
}
}
网络请求由工厂完成。
struct AppCenterPublisherFactory: DataTaskPublisherFactory {
let session: URLSession
init(session: URLSession = .shared) {
session.configuration.httpMaximumConnectionsPerHost = 1
self.session = session
}
func make(for request: URLRequest) -> URLSession.DataTaskPublisher {
return session.dataTaskPublisher(for: request)
}
}
问题是发布者立即发出网络请求。这会导致服务器返回 429 Too Many Requests。如何将 URLSession.DataTaskPublisher 请求排队,以便一次只发出一个每个请求之间有延迟?
【问题讨论】: