我的问题是一个概念性问题。
我有以下代码:
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/