swiftui - 在 SwiftUI 中从服务器下载数据的最佳实践

标签 swiftui

我的问题是一个概念性问题。

我有以下代码:

struct CategoriesList : View {

    @State private var categories: [CategoryMetadata] = []

    var body: some View {
        NavigationView {
            List(self.categories) { category in
                NavigationButton(destination: PostsList(category: category)) {
                    CategoryRow(category: category)
                }
            }
        }.navigationBarTitle(Text("Categorie"))
    }
}

这只是使用元素(类别)列表组成我的 UI,并且我有一个与我的 View 关联的状态,该状态会在 View 更改时自动更新 View 。

这一切都很奇特和美好,但对我来说不清楚谁应该触发网络请求来填充模型

我理解了绑定(bind)和 @state 想法,但是,一般来说,我应该如何构建代码以在开始时拥有我需要的模型?

在旧方法中,我会在 viewDidLoad 中实现此行为,但使用 SwiftUI 的新范例,获取数据的最佳方法是什么?

最佳答案

SwiftUI 社区尚未真正建立任何最佳实践,因为该技术太新了。我的回答基于我在不同 WWDC19 session 上看到的内容。

首先,创建一个具有 categories 属性的 BindableObject。然后编写您的网络请求代码并将 self.categories 设置为您新下载的类别。

import SwiftUI
import Combine

final class CategoryStore: BindableObject {
    var didChange = PassthroughSubject<Void, Never>()

    var categories = [String]()

    init() {
        // TODO: Fetch categories from API
        self.categories = ["A", "B", "C"]
    }
}

然后,将 CategoryStore 添加到 View 并将其与 List 一起使用来迭代类别。

import SwiftUI

struct ContentView : View {
    @ObjectBinding private var store = CategoryStore()

    var body: some View {
        List(store.categories.identified(by: \.self)) { category in
            Text(category)
        }
    }
}

每当 categories 属性更新时,您的 UI 都会更新为新类别 (tysm Combine )

关于swiftui - 在 SwiftUI 中从服务器下载数据的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56690551/

相关文章:

ios - Core Data + CloudKit 无法在其他设备上自动刷新?

swiftui - 在 SwiftUI 中,将 subview 放在函数中而不是结构体中是否有问题?

ios - 迪尔德 : Library not loaded SwiftUI when app runs on iOS 12 using @available(iOS 13. 0, *)

ios - 在 SwiftUI 卡 View 中跨设备将 UIImage 裁剪到特定区域

ios - 为什么 MagnificationGesture 在 SwiftUI 中只更新一次状态?

swiftui - 如何在 Swift UI 中不提供先前功能的情况下在自定义 View (ListRowView) 中添加按钮?

SwiftUI:如何更改警报按钮和 NavigationLink 后退按钮的颜色?

swift - 将数据从简单的 NSView 传递到 SwiftUI View

ios - 在 SwiftUI 中,有没有办法扩展和收缩 View 以在 View 的扩展版本中显示隐藏的文本和按钮?

SwiftUI 列表 - 如何滚动到项目