#swift #core-data #swiftui #cloudkit #watchos
#swift #core-данные #swiftui #cloudkit #watchos
Вопрос:
Я пытаюсь настроить CoreData / CloudKit в приложении watchOS с помощью NSPersistentCloudKitContainer
. Однако после вызова container.loadPersistentStores
viewContext.persistentStoreCoordinator
поле по-прежнему равно нулю.
Вот несколько примеров кода:
Persistence.swift
struct PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentCloudKitContainer
init() {
container = NSPersistentCloudKitContainer(name: "Test")
guard let description = container.persistentStoreDescriptions.first else {
fatalError("Could not retrieve a persistent store description.")
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error (error), (error.userInfo)")
}
})
}
}
MainApp.swift
@main
struct EventLoggerApp: App {
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(.managedObjectContext, persistenceController.container.viewContext)
}
}
}
ContentView.swift
struct ContentView: View {
@Environment(.managedObjectContext) private var viewContext
func createRecord() {
print(viewContext.persistentStoreCoordinator) // this is nil
let sensorReadingDescription = NSEntityDescription.entity(forEntityName: "SensorReading", in: viewContext)! // this crashes
}
}
Ошибка, с которой я сталкиваюсь, заключается в:
2020-12-12 11:56:32.205433-0800 EventLoggerWatch WatchKit Extension[400:541990] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ' entityForName: nil is not a legal NSPersistentStoreCoordinator for searching for entity name 'Test''
*** First throw call stack:
(0x1f4bb7dc 0x1edc9c04 0x23d68a44 0x174d34 0x174378 0x22fa9d6c 0x231422e0 0x23256ebc 0x22cb86a8 0x23256ed8 0x23256ebc 0x2327a6a4 0x2330f2dc 0x2324cdac 0x2324b6f4 0x2324b75c 0x2324bd20 0x4076df2c 0x40bd9f44 0x40763d70 0x40763e80 0x40763ce8 0x40b986cc 0x40b75abc 0x40becf04 0x40be59b4 0x1f43c4ec 0x1f43c3ec 0x1f43b74c 0x1f435dac 0x1f435574 0x235f94c0 0x40b580f8 0x40b5d5f8 0x350d9b68 0x1eed893c)
libc abi.dylib: terminating with uncaught exception of type NSException
Пожалуйста, дайте мне знать, если я смогу предоставить более полезный контекст, и заранее спасибо за руководство!
Комментарии:
1.
loadPersistentStores
это асинхронный метод, и, хотя для обычного хранилища на основе диска может быть установлено значениеshouldAddStoreAsynchronously = false
по умолчанию, я бы не стал делать ставку наNSPersistentCloudKitContainer
воспроизведение таким же образом. Проверьте свою последовательность с помощью пары отпечатков.2.Спасибо за комментарий, Уоррен. Я наблюдаю, что отпечатки в файле
loadPersistentStores
completionHandler
не отображаются. Куда я могу передатьshouldAddStoreAsynchronously
флаг?3. Похоже
shouldAddStoreAsynchronously
, это флаг дляNSPersistentStoreCoordinator
объекта, но я не создаю этот объект напрямую, насколько я могу судить. developer.apple.com/documentation/coredata /…4. Это свойство
NSPersistentStoreDescription
, которое вы восстанавливаете, но не используете, перед загрузкой хранилища вы можете изменить это описание.5. Понял! Я просто попытался добавить строку
description.shouldAddStoreAsynchronously = false
раньшеloadPersistentStores
, что привело к той же ошибке. Соответствует ли это тому, что вы думали изменить?
Ответ №1:
После дальнейшего расследования я не уверен, что этот вопрос верен. Я думаю, что приведенный выше код выполнялся только для целевого телефона, а не для часов. Также могут возникнуть проблемы с часами, но сначала я поработаю над тем, чтобы заставить телефон работать, поскольку проблемы, вероятно, есть. Спасибо всем, кто помог здесь!