Here is a little example of what I mean. If you take out the delay - it stops working:
import Combine
class Messages : ObservableObject {
static var shared = Messages()
@Published var isPresented:Bool = false
@Published var message:String = ""
var messages = ["One", "Two", "Three", "Four", "Five" ]
var subscriptions:[AnyCancellable] = []
init() {
$isPresented
.delay(for: .seconds(1), scheduler: DispatchQueue.main) // <- Take out this delay and it stops working.
.receive(on: DispatchQueue.main)
.sink{ [weak self] state in
print ("Getting new state: \(state)")
if state == false {
self?.next()
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3)) { [weak self] in
if self?.isPresented == true {
self?.isPresented = false
}
}
}
}
.store(in: &subscriptions)
}
func next() {
if messages.isEmpty == false {
self.message = messages.removeFirst()
self.isPresented = true
print ("Next Message \(self.message)")
}
}
}
@main
struct DummyApp: App {
@ObservedObject var messages = Messages.shared
@State var isPresented = false
var body: some Scene {
WindowGroup {
VStack {
Button("isPresented: \(String(describing:messages.isPresented))"){
messages.isPresented = true
}
.frame(width:150, height:100)
.alert("My Alert", isPresented: $isPresented, actions: { Button("OK"){} }, message:{ Text(messages.message) } )
.onReceive(messages.$isPresented){ state in
isPresented = state
}
Color.clear
.frame(width: 100,height: 300)
}
}
}
}