为什么不能在init中获取我的fetchedResults?

时间:2019-12-20 08:18:13

标签: swift core-data swiftui

我有一个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中执行提取操作,则可以正常工作。

1 个答案:

答案 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
}