Почему данные ядра не загружаются в класс swiftui, а в виде структуры - PullRequest
1 голос
/ 14 апреля 2020

Если я помещу приведенный ниже код в структурное представление, я могу использовать myShows в списке swiftui, но я пытаюсь выполнить тот же запрос выборки в отдельном классе, и я получаю сообщение об ошибке, если пытаюсь напечатать myShows или myShows [0] или что-нибудь в этом роде. Я предполагаю, что это никогда не будет инициализировано? Я не уверен.

@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(
  entity: MyShow.entity(),
  sortDescriptors: [
    NSSortDescriptor(keyPath: \MyShow.name, ascending: true)
  ]
)
  var myShows: FetchedResults<MyShow>

1 Ответ

1 голос
/ 15 апреля 2020

Причина, по которой он «магически» работает в структуре View, а не в отдельном классе, заключается в следующем:

ContentView().environment(\.managedObjectContext, context)

Эта View структура была предоставлена ​​в среде \.managedObjectContext объект, который он может использовать или передать другим View (автоматически) в своей иерархии, но не случайным классам. * Ref
Кроме того, @FetchRequest работает только тогда, когда вышеупомянутый объект среды был установлен. * Ref

Так что если вы попытаетесь получить доступ к следующему в случайном классе :

@Environment(\.managedObjectContext) var managedObjectContext

@FetchRequest(entity: Something.entity(), sortDescriptors: [])) 
var something: FetchedResults<Something>

Он не будет работать, поскольку он не наследует среду автоматически, как мог бы другой View.
Следовательно, он не может получить доступ к экземпляру ManagedObjectContext Базовых данных, и, таким образом, @FetchRequest также будет fail.

Чтобы исправить это, самым грубым способом было бы передать объект окружения в Class через его инициализатор и затем обработать его внутри.
Или вы можете перейти к шаблону MVVM и делать вещи немного по-другому, но это еще один топи c ent irely.
Если вам интересно, вы можете взглянуть на этот проект, который использует Core Data с простой настройкой View Model:

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