Причина, по которой он «магически» работает в структуре 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: