Я храню много данных в Core Data без каких-либо проблем.Теперь мне нужно добавить некоторые дополнительные данные.Вместо того чтобы создавать сущность для всех этих новых данных, я решил использовать тот факт, что сохраняемый объект (и все его дочерние элементы) реализуют NSCoding
, а скорее сохраняют объект как Transformable
(NSObject).Я делал это раньше (в Obj-c), но по какой-то причине я не могу заставить его работать на этот раз.
Допустим, у меня есть огромный класс с именем Event:NSObject,NSCoding
, который содержит имя, дату,и метрическая тонна дополнительных переменных.Затем представьте, что вы хотите, чтобы пользователь мог получать уведомления за заданное количество дней до начала мероприятия.Мол, пусть пользователь «смотрит» событие.Я хочу отслеживать, какие события отслеживаются и как долго, прежде чем я должен отправить уведомление.Благодаря этому я могу получить список всех «наблюдаемых» событий и узнать, за сколько дней до события им нужно уведомление.Это просто плохой пример реальной ситуации, просто терпите меня.Не думайте о части «уведомление», просто храните данные.
У меня есть Event
-объект, теперь я создал объект WatchEvent
в моей базе данных CoreData
, которая имеетдва атрибута: event:Transformable
и days:Integer
.Ни один из них не является обязательным.
Весь мой Event-класс и все его дочерние элементы теперь реализуют NSCoding, поэтому, чтобы сохранить это в базе данных, я просто установил его в преобразовываемый атрибут.Здесь вы можете увидеть, как я создаю WatchEvent
-объект и помещаю его в базу данных, а также функцию для получения всех WatchEvents
из БД и функцию для распечатки содержимого каждого WatchEvent.
func storeWatchEvent(someEvent:Event, numberOfDays:Int){
let watchEvent = WatchEvent(entity: NSEntityDescription.entity(forEntityName: "WatchEvent", in: managedObjectContext)!, insertInto: managedObjectContext)
watchEvent.days = numberOfDays //e.g 3
watchEvent.event = someEvent
saveContext()
}
func saveContext(){
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
func getWatchedEvents()->[WatchEvent]?{
return managedObjectContext.fetch(WatchEvent.fetchRequest())
}
func printOutAllWatchedEvents(){
if let watchedEvents = getWatchedEvents(){
watchedEvents.foreach{ (w) in
print("numberOfDays: ", w.days)
print("event: ", w.event)
}
}
}
func saveButtonClicked(){
storeWatchEvent(someEvent, numberOfDays:3)
// For testing, attempt to get all my events immediately, several times
printOutAllWatchedEvents() //Prints out `numberOfDays: 3` and a valid `event` correctly
printOutAllWatchedEvents() //Prints out `numberOfDays: 3` and a valid `event` correctly
printOutAllWatchedEvents() //Prints out `numberOfDays: 3` and a valid `event` correctly
}
func verifyButtonClicked(){
printOutAllWatchedEvents() //Prints out `numberOfDays: 3` and `nil` for event.
}
Допустим, у меня есть две кнопки.Один «Сохранить», а другой «Проверить».Если я нажимаю «Сохранить», я сохраняю действительные объекты и, как вы можете видеть в коде, я немедленно запрашиваю в базе данных все сохраненные WatchEvents и распечатываю их.В это время все выглядит хорошо.Если я нажму кнопку «проверить», она должна была распечатать то же самое, но она удалила мой event
.Ему удается сохранить days
-атрибут, но событие удаляется.Почему?: (
Не имеет значения, как долго я жду нажатия кнопки проверки. Если я нажимаю их почти одновременно, это все равно происходит.
Я звоню printOutAllWatchedEvents
в saveButtonClick три раза, и, поскольку ему удается каждый раз возвращать действительный объект события, я предполагаю, что сохранение / NSCoding-часть этого прошло успешно?
Но если я нажму кнопку проверки,что, я предполагаю, произойдет, по крайней мере, через несколько «циклов выполнения», трансформируемый event
-объект был удален ..
Я понятия не имею, что происходит.вернуть мои действительные события, если я запрашиваю их сразу после их вставки, но не если я запрашиваю их позже? Почему это влияет только на объект transformable
? Целое число days
правильно сохраняется для всех WatchEvent
с.Я пометил event
как , а не необязательно, как он может вернуть ноль и никогда не давать мне ошибок? Нет ошибок при вызове save
в контексте, я проверил.