SwiftUI .task aktualisiert seine Referenzen bei der Ansichtsaktualisierung nichtIOS

Programmierung für iOS
Anonymous
 SwiftUI .task aktualisiert seine Referenzen bei der Ansichtsaktualisierung nicht

Post by Anonymous »

Ich habe diesen Beispielcode

Code: Select all


import SwiftUI

struct ContentView: View {
var body: some View {
ParentView()
}
}

struct ParentView: View {
@State var id = 0
var body: some View {
VStack {
Button {
id+=1
} label: {
Text("update id by 1")
}

TestView(id: id)
}

}
}

struct TestView: View {
var sequence = DoubleGenerator()
let id: Int
var body: some View {
VStack {
Button {
sequence.next()
} label: {

Text("print next number").background(content: {
Color.green
})

}
Text("current id is \(id)")
}.task {
for await number in sequence.stream {

print("next number is \(number)")
}
}
}
}

final class DoubleGenerator {
private var current = 1
private let continuation: AsyncStream.Continuation

let stream: AsyncStream

init() {
var cont: AsyncStream.Continuation!
self.stream = AsyncStream { cont = $0 }
self.continuation = cont
}

func next() {
guard current >= 0 else {
continuation.finish()
return
}

continuation.yield(current)
current &*= 2
}
}

Die Druckanweisung wird immer nur ausgeführt, wenn ich nicht auf die Schaltfläche „ID um 1 aktualisieren“ klicke. Wenn ich auf diese Schaltfläche klicke und dann auf die Schaltfläche „Nächste Zahl drucken“ klicke, wird die Druckanweisung nicht in der Xcode-Konsole gedruckt. Ich denke, das liegt daran, dass die Änderung der ID den Aufruf der Init-Funktion der Ansicht ausgelöst hat, wodurch die Sequenzeigenschaft zurückgesetzt wurde, sodass nachfolgende Klicks auf die Schaltfläche „Nächste Zahl drucken“ die neue Version der Sequenz auslösen, die Aufgabe jedoch immer noch auf die vorherige Version verweist.
Ist das das erwartete Verhalten? Warum ist in onChange und Button der Verweis auf die Eigenschaften immer aktuell, in .task jedoch nicht?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post