Я пытаюсь сохранить CLLocation
данные в Core Data. Мое свойство установлено как трансформируемый объект.
Некоторый пример кода показывает, что можно сохранить данные о местоположении, используя этот объект, преобразованный в NSValue
.
CLLocationCoordinate2D myLocation;
NSValue *locationValue = [NSValue valueWithBytes:&myLocation objCType:@encode(CLLocationCoordinate2D)]
// then put locationValue into storage - maybe an ObjC collection class or core data etc.
Извлечение объекта из хранилища данных должно работать с использованием этой парадигмы.
CLLocationCoordinate2D myLocation;
NSValue *locationValue = // restored from your database or retrieved from your collection class
[locationValue getValue:&myLocation];
Я пытаюсь экстраполировать эту идею и записать весь объект CLLocation
в объект NSValue
, хранящийся в CoreData
, с целью восстановить объект CLLocation
из хранилища позднее.
При тестировании различных методов я обнаружил, что nil возвращается при попытке развернуть объект CLLocation
из хранилища основных данных. Я помещаю объект CLLocation
в хранилище, используя следующее:
//verified that I have a good CLLocation here
newManagedObject.setValue(location as CLLocation, forKey: "location")
Позже я пытаюсь развернуть CLLocation
let location = detail.valueForKey("location")! as CLLocation
Но я обнаружил, что объект не разворачивается должным образом.
Развернутый объект выглядит так:
(CLLocation) location = 0x00007fff59537c90 {
ObjectiveC.NSObject = {}
}
Таким образом, любое использование объекта CLLocation
в этот момент возвращает ошибку "Найдено nil... error"
Я упустил что-то очевидное в хранении/извлечении объектов CLLocation
с помощью Swift?
ОБНОВЛЕНИЕ
Ответ Дэниела помог мне понять, что NSValueTransformer мне не подойдет, поэтому я вернулся к подходу, который использовал раньше. В основном кодируйте граф объектов, используя NSKeyedArchiver. Моя цель, как всегда, — использовать максимально простое решение, поэтому я решил не использовать подклассы управляемых объектов, поскольку нужные мне свойства уже есть в существующем объекте CLLocation. Я изменил преобразуемое поле на двоичные данные с отмеченным параметром (хранить во внешнем файле записи). Я решил протестировать этот процесс с минимальными изменениями в шаблоне основной детали.
Сохранение графа объекта CLLocation
//assuming location is a valid CLLocation and data model has a binary data field
let archivedLocation = NSKeyedArchiver.archivedDataWithRootObject(location)
newManagedObject.setValue(archivedLocation, forKey: "location")
Восстановление графа объектов из хранилища данных
На основном vc в рамках подготовки по умолчанию к переходу данные восстанавливаются через контроллер выборки.
let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
let controller = (segue.destinationViewController as UINavigationController).topViewController as DetailViewController
controller.detailItem = object
В подробностях vc я разворачиваю свой граф объектов с помощью NSKeyedUnarchiver.
var lc = NSKeyedUnarchiver.unarchiveObjectWithData(detail.valueForKey!("location") as NSData) as CLLocation