【问题标题】:Why can't I get the my fetchedResults in init?为什么我无法在 init 中获取我的 fetchedResults?
【发布时间】:2020-04-12 18:31:37
【问题描述】:

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

【问题讨论】:

  • 在fetchedResults使用前尝试使用fetchRequest.update()
  • 崩溃日志中显示的错误信息是什么?
  • 这是 MacOS 还是 iOS?最后一个错误看起来像是在 MacOS 上尚未加载持久存储协调器的问题。在 AppDelegate 中为 var persistentContainer 删除 lazy 或确保在创建 ContentView 之前对其进行初始化是一种解决方案。
  • @JoakimDanielson 这是 iOS 但仍在模拟器中。消除惰性并没有帮助。

标签: swift core-data swiftui


【解决方案1】:

我刚刚遇到了同样的问题,你现在可能已经让它工作了,但我想如果他们将来遇到这个问题我会帮助他们。您将无权访问 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
}

【讨论】:

  • 我也使用了 onAppear 并且效果很好。但我仍然想知道是否还有其他方法。
  • 在 SwiftUI 1.0 中没有办法做到这一点。希望他们在下一个版本中解决这个问题
猜你喜欢
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多