Я пытался создать динамическую c форму с использованием SwiftUI и Combine, которая загружает параметры ввода (в примере number
) на основе другого ввода (в примере myString
).
Проблема в том, что стек Combine выполняется непрерывно, делая множество сетевых запросов (в примере, имитируемых задержкой), даже если значение никогда не менялось.
Я думаю, что ожидаемое поведение таково, что $myString
публикует значения только при их изменении.
class MyModel: ObservableObject {
// My first choice on the form
@Published var myString: String = "Jhon"
// My choice that depends on myString
@Published var number: Int?
var updatedImagesPublisher: AnyPublisher<Int, Never> {
return $myString
.removeDuplicates()
.print()
.flatMap { newImageType in
return Future<Int, Never> { promise in
print("Executing...")
// Simulate network request
DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
let newNumber = Int.random(in: 1...200)
return promise(.success(newNumber))
}
}
}
.receive(on: DispatchQueue.main)
.eraseToAnyPublisher()
}
}
struct ContentView: View {
@ObservedObject var model: MyModel = MyModel()
var body: some View {
Text("\(model.number ?? -100)")
.onReceive(model.updatedImagesPublisher) { newNumber in
self.model.number = newNumber
}
}
}