结合。如何取消flatMap'ed的发布者?

这里是Combine &反应式编程的新手,所以非常感谢大家的帮助。

我有以下场景:我想建立一个UI,用户可以通过页面上的各种 “过滤器 “按钮过滤内容。当用户点击其中一个按钮时,我需要发送一个API请求来获取数据。

现在,我有一个发布者为我提供这些选择的 “状态”,我的代码结构是这样的。

        state
            .publisher /* sends whenever 'state' updates behind the scenes */
            .debounce(for: 1.0, scheduler: DispatchQueue.main)
            .map { /*  create some URL request */ }
            .flatMap {
                URLSession.shared.dataTaskPublisher(for: someRequest)
                    .map { $0.data }
                    .decode(type: MyResponseType.self, decoder: JSONDecoder())
        }.sink(receiveCompletion: { (completion) in
            /// cancelled
        }) { (output) in
             /// go show my results
             /// Ideally, this is only called when the most recent API call finishes!
        }.store(in: &cancellables)

然而,这个实现在下面的情况下有一个bug: 如果一个事件通过flatMap发出了一个请求,而随后的事件在网络调用完成之前也发出了同样的请求,那么我们将两次调用完成处理程序。

最好的情况是,我们以某种方式取消内部管道,这样我们只执行最近的事件的完成处理程序。

当新的事件进入管道时,我怎样才能 “取消 “内部管道(由dataTaskPublisher启动的管道)而不破坏外部管道?

解决方案:

你不希望 flatMap. 你想 switchToLatest. 改变你的 flatMap 归于平淡 map,然后加上 .switchToLatest() 在它之后。因为 switchToLatest 需要匹配故障类型,您可能还需要使用 mapError. 该 decode 操作员产生故障类型 Error所以,你可以 mapErrorError.

例如:

state
    .publisher /* sends whenever 'state' updates behind the scenes */
    .debounce(for: 1.0, scheduler: DispatchQueue.main)
    .map { makeURLRequest(from: $0) }
    .map({ someRequest in
        URLSession.shared.dataTaskPublisher(for: someRequest)
            .map { $0.data }
            .decode(type: MyResponseType.self, decoder: JSONDecoder())
    })
    .mapError { $0 as Error }
    .switchToLatest()
    .sink(
        receiveCompletion: ({ (completion) in
            print(completion)
            /// cancelled
        }),
        receiveValue: ({ (output) in
            print(output)
            /// go show my results
            /// Ideally, this is only called when the most recent API call finishes!
        }))
    .store(in: &cancellables)

给TA打赏
共{{data.count}}人
人已打赏
未分类

Windows应用程序在点击按钮时大部分时间都会冻结。

2022-9-8 19:59:38

未分类

有没有办法从Google TTS输出中删除padding?

2022-9-8 19:59:40

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索