首页 > 解决方案 > iOS 合并仅在先前已完成时才开始新请求

问题描述

我有网络请求会触发 situi 中的每个最后一个单元格。有时,如果用户向下滚动足够快 -> 向上 -> 请求将在第一个完成之前触发。如果没有组合或反应方法,我有完成块和布尔值来处理这个:

public func load() {
        guard !isLoadingPosts else { return }
        isLoadingPosts = true
        postsDataProvider.loadMorePosts { _ in
            self.isLoadingPosts = false
        }
    }

我想知道是否可以通过 combine 更优雅地解决此问题,而无需使用 bool 值。例如,仅在先前已完成时才执行请求?

标签: iosswiftcombine

解决方案


如果通话已在进行中,您似乎想跳过通话。

由于您没有共享您可能拥有的任何组合代码,我假设您有一个发布者返回函数,如下所示:

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(())
}

推荐阅读