SwiftUI .task не обновляет свои ссылки при обновлении представленияIOS

Программируем под IOS
Ответить
Anonymous
 SwiftUI .task не обновляет свои ссылки при обновлении представления

Сообщение Anonymous »

У меня есть этот пример кода

Код: Выделить всё


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
}
}

оператор печати выполняется только в том случае, если я не нажимаю кнопку обновления идентификатора 1. Если я нажму на эту кнопку, а затем нажму кнопку печати следующего номера, оператор печати не будет распечатан в консоли xcode. Я думаю, это связано с тем, что изменение идентификатора вызвало вызов функции инициализации представления, сбросив свойство последовательности, и поэтому последующие нажатия кнопки печати следующего номера запускают новую версию последовательности, но задача все еще ссылается на предыдущую версию.
Это ожидаемое поведение? Почему в onChange и Button ссылка на свойства всегда актуальна, а в .task — нет?

Подробнее здесь: https://stackoverflow.com/questions/798 ... iew-update
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»