ios - iOS 合并仅在先前已完成时才开始新请求
问题描述
我有网络请求会触发 situi 中的每个最后一个单元格。有时,如果用户向下滚动足够快 -> 向上 -> 请求将在第一个完成之前触发。如果没有组合或反应方法,我有完成块和布尔值来处理这个:
public func load() {
guard !isLoadingPosts else { return }
isLoadingPosts = true
postsDataProvider.loadMorePosts { _ in
self.isLoadingPosts = false
}
}
我想知道是否可以通过 combine 更优雅地解决此问题,而无需使用 bool 值。例如,仅在先前已完成时才执行请求?
解决方案
如果通话已在进行中,您似乎想跳过通话。
由于您没有共享您可能拥有的任何组合代码,我假设您有一个发布者返回函数,如下所示:
func loadMorePosts() -> AnyPublisher<[Post], Error> {
//...
}
然后你可以使用一个主题来发起一个加载调用,一个flatMap(maxPublishers:_:)
下游,发布者的数量限制为 1:
let loadSubject = PassthroughSubject<Void, Never>()
loadSubject
.flatMap(maxPublishers: .max(1)) {
loadMorePosts()
}
.sink(
receiveCompletion: { _ in },
receiveValue: { posts in
// update posts
})
.store(in: &cancellables)
上面的管道订阅了主题,但如果另一个值在flatMap
准备好接收它之前到达,它将被简单地丢弃。
那么load
函数就变成了:
func load() {
loadSubject.send(())
}
推荐阅读
- sql - 如何改进(Postgres)-SQL 查询或表以获得更高的吞吐量
- javascript - 如何通过 react.js 中的组件传递变量或数据?
- hazelcast - Hazelcast 对键的谓词
- typescript - TypeScript:从对象值派生的动态联合类型
- c# - 为不同客户定制数据模型的单一应用程序
- javascript - 无法在数组内的对象中添加属性
- python - 抓取图像并保存 jpg
- c# - 为什么这段代码不能让我的播放器跳转到给定的vector3
- machine-learning - 如何为 ML.NET 中的图像分类模型训练创建 .tsv 文件?
- http-headers - Istio 添加的 header 会不会太大?