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模板预览时崩溃问题的解决

Xcode 12.2+生成SwiftUI 2.0 CoreData模板预览时崩溃问题的解决

一行代码解决CoreData托管对象属性变更在SwiftUI中无动画效果的问题