Предотвращение нескольких вызовов для функции загрузки продуктовIOS

Программируем под IOS
Ответить
Anonymous
 Предотвращение нескольких вызовов для функции загрузки продуктов

Сообщение Anonymous »

У меня есть продукт, который отображает все продукты. Я хочу убедиться, что пользователь не может выполнить несколько параллельных вызовов для загрузочных продуктов. В настоящее время я использую следующий код и работает. Но я ищу лучшие варианты и, возможно, даже перемещаю логику отмены задач в магазине. < /P>
struct ProductListScreen: View {

let category: Category
@Environment(Store.self) private var store
@Environment(\.dismiss) private var dismiss
@State private var showAddProductScreen: Bool = false
@State private var isLoading: Bool = false

private func loadProducts() async {

guard !isLoading else { return }
isLoading = true

defer { isLoading = false }

do {
try await store.loadProductsBy(categoryId: category.id)
} catch {
// show error in toast message
print("Failed to load: \(error.localizedDescription)")
}
}

var body: some View {
ZStack {
if store.products.isEmpty {
ContentUnavailableView("No products available", systemImage: "shippingbox")
} else {
List(store.products) { product in
NavigationLink {
ProductDetailScreen(product: product)
} label: {
ProductCellView(product: product)
}
}.refreshable(action: {
await loadProducts()
})
}
}.overlay(alignment: .center, content: {
if isLoading {
ProgressView("Loading...")
}
})
.task {
await loadProducts()
}
< /code>
Вот моя реализация магазина. < /p>
@MainActor
@Observable
class Store {

var categories: [Category] = []
var products: [Product] = []

let httpClient: HTTPClient

init(httpClient: HTTPClient) {
self.httpClient = httpClient
}

func loadProductsBy(categoryId: Int) async throws {

let resource = Resource(endpoint: .productsByCategory(categoryId), modelType: [Product].self)
products = try await httpClient.load(resource)
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... s-function
Ответить

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

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

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

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

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