Сочетание трех сигналов очень просто: используйте .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
, как я уже говорил. Он генерирует кортеж после того, как все три издателя издали свой сигнал first - и это вся необходимая информация, потому что вы получили результат от вызова метода плюс Bools, которые сообщают вам поступили ли уведомления в срок. Теперь вы можете читать этот кортеж, анализировать его и делать все, что вам нравится. Оператор .zip
имеет функцию отображения, поэтому вы можете выводить результаты анализа в хорошем порядке. (Если вы хотите преобразовать результат функции карты в ошибку, для этого потребуется дополнительный оператор, но опять же, это просто.)