gpt4 book ai didi

ios - Swift 组合 : combining three signals into one

转载 作者:行者123 更新时间:2023-12-01 16:12:34 27 4
gpt4 key购买 nike

我正在处理一个遗留库,我不能随意修改它们的代码,并且我正在尝试使用 Combine 将它们编织成更易于使用的东西。我的情况是方法调用可以返回一个响应,或者一个响应和两个通知。仅响应是成功场景,响应 + 2 个通知是错误场景。我想将来自两个通知的响应和有效负载合并为一个错误,我可以将其传递给我的应用程序。真正有趣的是,我无法保证响应或通知是否先出现,也不能保证哪个通知先出现。通知来自与响应不同的线程。好消息是他们“几乎同时”进来。

为了处理通知,我做

firstNotificationSink = notificationCenter.publisher(for: .firstErrorPart, object: nil)
.sink { [weak self] notification in
// parse and get information about the error
}

secondNotificationSink = notificationCenter.publisher(for: .secondErrorPart, object: nil)
.sink { [weak self] notification in
// parse and get more information about the error
}

并要求遗留库做出回应是:

func doJob() -> String {
let resultString = libDoStuff(reference)
}

给定 50 毫秒的时间范围,我有没有办法使用组合将这三个信号合并为一个?意思是,如果我得到结果和两个通知,我有一个错误响应我可以传递给我的应用程序,如果我只有结果并且在 50 毫秒内没有通知到达,那么我可以将该成功响应传递给我的应用程序吗?

最佳答案

关于组合三个信号的部分很简单:使用 .zip .这不是很有趣。问题的有趣部分是,您需要一个管道来表示通知是否在特定时间限制内到达。这是如何做到这一点的示例(我没有使用您的实际数字,这只是一个演示):

import UIKit
import Combine

enum Ooops : Error { case oops }

class ViewController: UIViewController {
var storage = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
print("start")
NotificationCenter.default.publisher(for: Notification.Name("yoho"))
.map {_ in true}
.setFailureType(to: Ooops.self)
.timeout(0.5, scheduler: DispatchQueue.main) { Ooops.oops }
.replaceError(with: false)
.sink {print($0)}
.store(in: &self.storage)
DispatchQueue.main.asyncAfter(deadline:.now()+0.2) {
NotificationCenter.default.post(name: Notification.Name("yoho"), object: self)
}
}
}

如果 asyncAfter延迟是 0.2 ,我们得到 true (后跟 false ,但这并不重要;如果我们愿意,我们可以更改它)。如果延迟是 0.9 ,我们得到 false .所以关键是,我们得到的第一个值正确地区分了我们是否在要求的时间内得到了信号。

好的,剩下的就很简单了:您只需将三个信号与 .zip 连接起来即可。 ,正如我之前所说。在所有三个发布者都发出第一个信号后,它会发出一个元组——这就是你需要的所有信息,因为你已经从方法调用中得到了结果,再加上 Bools 来告诉你通知是否在时间限制内到达。您现在可以读取该元组并对其进行分析,然后做任何您想做的事情。 .zip运算符有一个 map 功能,因此您可以按良好的顺序发出分析结果。 (如果您想将 map 函数的结果转换为错误,则需要进一步的运算符,但同样,这很容易。)

关于ios - Swift 组合 : combining three signals into one,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61034743/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com