我有一个SwiftUI View结构,将init函数中的 Place 对象传递给该结构。我想使用 id 从CoreData加载相应的 UserPlaceInfo 。 不幸的是,当我尝试访问init函数中的fetchedResults时,我的应用程序崩溃了。 如果我在onAppear中使用相同的代码,则可以正常工作。
private var fetchRequest : FetchRequest <UserPlaceInfo>
private var fetchedResults: FetchedResults<UserPlaceInfo> { fetchRequest.wrappedValue }
init(place : Place) {
self.place = place
fetchRequest = FetchRequest<UserPlaceInfo>(entity : UserPlaceInfo.entity(), sortDescriptors : [] , predicate: NSPredicate(format: "id == %@", place.id))
// Application crashes here!
let count = fetchedResults.count
}
为什么会这样,我该怎么办? 我是在做错什么,还是目前尚无法使用fetchedResults? 我很早就需要结果,因为如果CoreData中没有UserPlaceInfo,则必须创建这样的对象。
更新
添加 fetchRequest.update()有所帮助。现在,我收到一条更有用的错误消息:环境中的上下文未连接到持久性存储协调器
我还是不明白发生了什么。我将ManagedObjectContext添加到SceneDelegate中的环境中,并且如果我在onAppear中执行提取操作,则可以正常工作。
答案 0 :(得分:2)
我也遇到了同样的问题,您可能现在已经可以使用它了,但是我认为如果将来有人遇到这种情况,我会帮助您。您将无法访问init中的managedObjectContext。相反,您要做的是创建一个单独的方法并在出现时调用它。像这样修改代码。
init(place : Place) {
self.place = place
fetchRequest = FetchRequest<UserPlaceInfo>(entity : UserPlaceInfo.entity(), sortDescriptors : [] , predicate: NSPredicate(format: "id == %@", place.id))
}
然后在你的体内,做这样的事情
var body: some View {
VStack {
.. your views here
}.onAppear(perform: onLoad) // the magic!
}
最后
func onLoad()
{
print(fetchedResults.count) // it should work now
}