Просто вставьте flatMap, как показано ниже, и вы сможете добиться желаемого.
self.myButton.publisher(for: \.touchUpInside).flatMap{
(data: Bool) in
return Just(data).tryMap({ _ -> String in
if Bool.random() {
throw MyError.someError
} else {
return "we're in the else case"
}}).replaceError(with: "replaced Error")
}.sink(receiveCompletion: { (completed) in
print(completed)
}, receiveValue: { (sadf) in
print(sadf)
}).store(in: &cancellables)
Рабочая модель выглядит следующим образом:
Just(parameter).
flatMap{ (value)->AnyPublisher<String, Never> in
return MyPublisher(value).catch { <String, Never>() }
}.sink(....)
Если мы используем приведенный выше пример, это может бытьнапример:
let firstPublisher = {(value: Int) -> AnyPublisher<String, Error> in
Just(value).tryMap({ _ -> String in
if Bool.random() {
throw MyError.someError
} else {
return "we're in the else case"
}}).eraseToAnyPublisher()
}
Just(1).flatMap{ (value: Int) in
return firstPublisher(value).replaceError(with: "replaced Error")
}.sink(receiveCompletion: { (completed) in
print(completed)
}, receiveValue: { (sadf) in
print(sadf)
}).store(in: &cancellables)
Здесь вы можете заменить firstPublisher
на AnyPublisher, который принимает один параметр.
Также здесь, firstPublisher имеет только одно значение, он может выдавать только одно значение. Но если ваш издатель может выдать несколько значений, он не завершится до того, как будут выпущены все значения.