【问题标题】:iOS Combine Start new request only if previous has finishediOS 合并仅在先前已完成时才开始新请求
【发布时间】:2021-06-25 10:10:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios swift combine


    【解决方案1】:

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

    由于您没有共享您可能拥有的任何合并代码,我假设您具有这样的发布者返回函数:

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

    【讨论】:

    • 这正是我想要的,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2020-06-29
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多