【发布时间】:2022-01-20 08:49:48
【问题描述】:
我是使用 Combine 的新手,坦率地说,我不知道这个问题是否愚蠢,无论如何我有一个发布者,然后我通过以下方式从 RESTful 操作中检索到的对象数组返回给调用者:
let publisher = URLSession.shared.dataTaskPublisher(for: URL)
.handleEvents(
receiveSubscription: { _ in
activityIndicatorPublisher.send(true)
}, receiveCompletion: { _ in
activityIndicatorPublisher.send(false)
}, receiveCancel: {
activityIndicatorPublisher.send(false)
})
.tryMap { data, response -> Data in
guard let httpResponse = response as? HTTPURLResponse,
httpResponse.statusCode == 200 else {
throw NetworkError.httpError
}
print(String(data: data, encoding: .utf8) ?? "")
return data
}
.decode(type: [ShowElement].self, decoder: JSONDecoder())
.flatMap { $0.publisher }
.map(\.show?.image?.medium)
.flatMap(maxPublishers:.max(1)) { url in
URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.replaceError(with: Data())
}
.map{ imageData, item -> ShowElement in
var mutableItem = item
mutableItem.imageData = imageData
return mutableItem
}
.collect()
.catch { error -> Just<[ShowElement]> in
print(error)
return Just([])
}
.eraseToAnyPublisher()
return publisher
}
当我执行 dataTaskPublisher 时,我收到错误:“在调用实例方法 dataTaskPublisher 时没有完全匹配,当我执行 imageData 的映射时,我收到另一个错误:”上下文闭包类型 '(Publishers.FlatMap
【问题讨论】:
标签: json swift asynchronous combine