SwiftUI CoreData MVVM приводит к ошибке «EXC_BAD_INSTRUCTION ....» - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь использовать ViewModel между ContentView и Core Data в SwiftUI. Xcode Builder запускает приложение, но я получаю немедленную ошибку: Поток 1: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0) для var recList.

Может кто-нибудь помочь?

Следуя простому примеру того, что я делаю:

ListViewModel:

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)
    }

}

ViewModel:

class ViewModel {

    var name: String = ""

    init(db: Newdb) {
        self.name = db.name!
    }

}

ContentView:

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)
        }



    }
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Из того, что я могу сказать, FetchRequest - это обертка свойств.

Предполагается что-то обернуть, например;

@FetchRequest(
    entity: User.entity(),
    sortDescriptors: []
) var users: FetchedResults<User> // users are 'wrapped' in a FetchRequest instance

Имеет смысл, что wrappedValue - это ноль, потому что в

self.recRequest = FetchRequest(entity: Newdb.entity(), sortDescriptors: [])

нет ничего, что вы могли бы перепроверить.

0 голосов
/ 26 апреля 2020

две вещи, которые я заметил; ваш ListViewModel является ObservableObject, но у вас нет @Published var ... Также при создании класса, такого как ListViewModel, вы не можете использовать recRequest, как в recList, потому что он еще не создан. Он создается в методе init () не раньше. Сделайте ваш "recList = FetchedResults {recRequest.wrappedValue}" где-нибудь еще, как в fetchEntries ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...