Почему асинхронная задача отменяется в обновляемом модификаторе в ScrollView (iOS 16)IOS

Программируем под IOS
Ответить
Anonymous
 Почему асинхронная задача отменяется в обновляемом модификаторе в ScrollView (iOS 16)

Сообщение Anonymous »

Я пытаюсь использовать модификатор обновления в представлении прокрутки в приложении, предназначенном для iOS 16. Но асинхронная задача отменяется во время жеста обновления.
Вот некоторый код и прикрепленное видео, демонстрирующее проблему, и изображение с напечатанной ошибкой:
ExploreViemModel.swift

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

class ExploreViewModel: ObservableObject {

@Published var randomQuotes: [Quote] = []

init() {
Task {
await loadQuotes()
}
}

@MainActor
func loadQuotes() async {

let quotesURL = URL(string: "https://type.fit/api/quotes")!

do {
let (data, urlResponse) = try await URLSession.shared.data(from: quotesURL)
guard let response = urlResponse as? HTTPURLResponse else { print("no response"); return}

if response.statusCode == 200 {
let quotes =  try JSONDecoder().decode([Quote].self, from: data)
randomQuotes.append(contentsOf: quotes)
}
} catch {
debugPrint(error)
debugPrint(error.localizedDescription)
}
}

func clearQuotes() {
randomQuotes.removeAll()
}
}
ContentView.swift

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

import SwiftUI

struct ContentView: View {

@StateObject private var exploreVM = ExploreViewModel()

var body: some View {

NavigationStack {
ExploreView()
.environmentObject(exploreVM)
.refreshable {
exploreVM.clearQuotes()
await exploreVM.loadQuotes()
}
}
}
}
Explore.swift

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

import SwiftUI

struct ExploreView: View {

@EnvironmentObject var exploreVM: ExploreViewModel

var body: some View {
ScrollView {
VStack {
LazyVGrid(columns: [GridItem(.adaptive(minimum: 140.0), spacing: 24.0)], spacing: 24.0) {
ForEach(exploreVM.randomQuotes) { quote in
VStack(alignment: .leading) {
Text("\(quote.text ?? "No Text")")
.font(.headline)
Text("\(quote.author ?? "No Author")")
.font(.caption)
}
.frame(minWidth: 0, maxWidth: .infinity)
.frame(height: 144.0)
.border(Color.red, width: 2.0)

}

}
}
.padding()
.navigationTitle("Explore")
}

}
}
Изображение

< img alt="Ошибка печати" src="https://i.sstatic.net/VoFPv.png" />

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

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

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

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

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

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