ios - 需要在构造函数中初始化@State var,但是@FetchRequest 还没有返回
问题描述
我有两个符合协议的核心数据类GalleryItem
。首先我得到负载数据FetchRequest
:
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \CloudPage.orderIndex, ascending: true)],
animation: .default)
private var pages: FetchedResults<CloudPage>
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Folder.orderIndex, ascending: true)],
animation: .default)
private var folders: FetchedResults<Folder>
// I also have this items array
@State var items:[GalleryItem]
items
在这里我试图初始化init
:
init() {
self.items = getOrderedItems()
}
这是getOrderedItems()
:
func getOrderedItems(in folder:Folder?) -> [GalleryItem] {
let pages = getAllPages()
let folders = getAllFolders()
return (pages + folders).sorted {
$0.getOrderIndex() < $1.getOrderIndex()
}
}
问题是,运行时pages
andfolders
数组是空的。这些函数的实现非常简单:
func getAllPages() -> [CloudPage] {
var arr:[CloudPage] = []
for p in pages {
arr.append(p)
}
return arr
}
func getAllFolders() -> [Folder] {
var arr:[Folder] = []
for p in folders {
arr.append(p)
}
return arr
}
我猜 init 中的代码在请求完成之前正在运行?我怎样才能等待请求完成,以免items
最终为空?
解决方案
而不是这个
@State var items:[GalleryItem]
init() {
self.items = getOrderedItems()
}
通常的模式是在 中执行此操作onAppear
,例如
@State var items:[GalleryItem] = []
var body: some View {
Text("Your root view here")
.onAppear {
self.items = getOrderedItems() // << here !!
}
}
推荐阅读
- typescript - 打字稿中的'Pick'和'A&B'有什么区别
- autosar - BSWM 模块(作为模式管理器)如何接收来自应用程序 SWC(作为用户模式)的请求以更改 AUTOSAR 中的模式?
- reactjs - 使用formik在多重选择中反应自动完成的验证问题
- octave - 八度:对脚本的无效调用
- android-studio - Android Studio ArrayAdapter 和 ListView 错误
- python - Python Pandas 读取 excel 时间字段,得到不准确的结果
- c++ - 如何理解“ADL 只考虑函数参数,而不考虑模板参数”?
- macos - 如何让 Apple Script 仅在特定的显示器/监视器中单击?
- qt - 在 Android 上使用打开的 Drawer 关闭 Qml 应用程序
- python - 如何使用python和gridfs将放置在谷歌表上的图像链接(链接到谷歌驱动器中的文件夹)存储到mongo db