SwiftUI CoreData MVVM 解决错误“EXC_BAD_INSTRUCTION....”
Posted
技术标签:
【中文标题】SwiftUI CoreData MVVM 解决错误“EXC_BAD_INSTRUCTION....”【英文标题】:SwiftUI CoreData MVVM resolutes in error "EXC_BAD_INSTRUCTION...." 【发布时间】:2020-04-25 22:13:22 【问题描述】:我正在尝试在 SwiftUI 中的 ContentView 和 Core Data 之间使用 ViewModel。 Xcode builder 运行应用程序,但我立即收到错误:Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) for var recList。
谁能帮忙?
以下是我正在做的一个简单示例:
列表视图模型:
class ListViewModel: ObservableObject
var recRequest: FetchRequest<Newdb>
var recList: FetchedResults<Newdb>recRequest.wrappedValue <-------- error appears here
@Published var records = [ViewModel]()
init()
self.recRequest = FetchRequest(entity: Newdb.entity(), sortDescriptors: [])
fetchEntries()
func fetchEntries()
self.records = recList.map(ViewModel.init)
视图模型:
class ViewModel
var name: String = ""
init(db: Newdb)
self.name = db.name!
内容视图:
struct ContentView: View
@ObservedObject var listViewModel: ListViewModel
init()
self.listViewModel = ListViewModel()
var body: some View
ForEach(listViewModel.records, id: \.name) index in
Text(index.name)
【问题讨论】:
【参考方案1】:我注意到了两件事;您的 ListViewModel 是 ObservableObject 但您没有任何 @Published var ... 此外,在创建诸如 ListViewModel 之类的类时,您不能像在 recList 中那样使用“recRequest”,因为它尚未创建。它是在 init() 方法中创建的,而不是之前。 在其他地方执行“recList = FetchedResultsrecRequest.wrappedValue”,例如在 fetchEntries() 中。
【讨论】:
非常感谢您的回答。我将 var records = [ViewModel]() 更改为 @Published var records = [ViewModel]()。不,recList 不会出现在任何其他类/视图等中。这就是我创建的所有代码。但是,如果我只是将“recList = FetchedResultsrecRequest.wrappedValue”移动到 init() 部分,我仍然会得到同样的错误。还有其他想法吗? 不要误会我的意思,我并不是建议你将代码放入 init() 中。事实上,我强烈建议你不要这样做。尝试使用 static func createListViewModel(...) 之类的方法来创建带有回调的类的实例,以防在获取时出现错误。当您在 init() 中执行所有这些操作时,您永远不知道是否存在错误,或者当您想使用它时对象是否已准备好。 再次感谢您的回答。在我尝试了几件事后,我找不到任何解决方案。你能给我一个例子吗?【参考方案2】:据我所知,FetchRequest 是一个属性包装器。
它应该包装一些东西,例如;
@FetchRequest(
entity: User.entity(),
sortDescriptors: []
) var users: FetchedResults<User> // users are 'wrapped' in a FetchRequest instance
wrappedValue
是 nil 是有道理的,因为没有任何东西可以包装
self.recRequest = FetchRequest(entity: Newdb.entity(), sortDescriptors: [])
您可能需要仔细检查它的用法。
【讨论】:
以上是关于SwiftUI CoreData MVVM 解决错误“EXC_BAD_INSTRUCTION....”的主要内容,如果未能解决你的问题,请参考以下文章
如何为此 SwiftUI CoreData 模型正确插入排序描述符?
SwiftUI+CoreData项目出现The operation couldn’t be completed(GenericObjCError error 0)错误的解决
一行代码解决CoreData托管对象属性变更在SwiftUI中无动画效果的问题
Xcode 12.2+生成SwiftUI 2.0 CoreData模板预览时崩溃问题的解决