2015-11-09 2 views
1

Я хотел бы использовать пользовательские классы с необязательными типами в области. Для сериализации и работы с CLLocation например моя идея заключается в следующем:Лучший способ сериализации необязательного свойства, которое имеет собственный класс

class MyClass : Object { 
    dynamic var _coordinates :NSData? 

    var coordinates :CLLocation? { 
     get { 
      if _coordinates == nil { 
       return nil 
      } 
// we can cache it too to avoid deserialization every time 
      let coordinatesObj : CLLocation = NSKeyedUnarchiver.unarchiveObjectWithData(_coordinates!) as! CLLocation 
      return coordinatesObj 
     } 
     set(newCoordinates) { 
      if newCoordinates == nil { 
       _coordinates = nil 
      } else { 
       _coordinates = NSKeyedArchiver.archivedDataWithRootObject(newCoordinates!) 
      } 
     } 
    } 
... 
} 

Есть ли лучший способ? Должны ли мы иметь какой-то протокол в Realm, который позволяет нам возвращать необязательный NSData для определенного свойства? Другая идея - создать собственный метод, например ignoredProperties, который может использоваться для реализации логики для преобразования объекта в NSData? и наоборот для набора настраиваемых свойств.

ответ

1

Я действительно не думаю, что есть лучший способ, чем это. Если вы хотите обслуживать более сложные объекты, чем те, которые поддерживает Realm, вам всегда потребуется реализовать дополнительную логику для сериализации/десериализации данных.

Лично я являюсь поклонником последнего предложенного метода: добавьте новое свойство, пометьте его как проигнорированное, а затем вручную реализуйте его аксессуры для выполнения необходимой логики в отношении связанного с ним свойства Realm.

+0

Да, я обсуждал это на официальной странице сообщества github, но это гораздо более чистый способ справиться с этой проблемой. Однако, используя flatMap, мы можем избежать некоторых других шаблонов. Я добавил его ниже. – danielemm

0

В настоящее время нет другого способа или обходного пути для решения моей проблемы. Тем не менее, я нашел еще один способ более понятным способом справиться с этими потребностями. На самом деле основная концепция такая же, но она использует flatMap, чтобы избежать некоторых контрольных проверок. Надеюсь, это поможет.

class MyClass: Object { 
    dynamic var _coordinates: NSData? 

    var coordinates: CLLocation? { 
     get { 
      return _coordinates.flatMap(NSKeyedUnarchiver.unarchiveObjectWithData) as? CLLocation 
     } 
     set { 
      _coordinates = newValue.flatMap(NSKeyedArchiver.archivedDataWithRootObject) 
     } 
    } 
} 
Смежные вопросы