有什么方法可以在本地存储复杂的动态对象(iOS,swift)?

时间:2017-01-08 20:23:12

标签: ios swift

我有iOS应用程序,它将服务器中的数据作为json,然后将它们序列化为不同类型的对象。类型可以很复杂,可以包含子类型,可以继承,所以没有任何限制。使一切变得更复杂的另一件事是一些类型存储为AnyObject?并且只有在运行时才会根据特定规则将它们序列化为实际类型。这样的事情:

class A {
     var typeName: String?
     var b: AnyObject?
}

然后当它被序列化时,可以这样做:

if let someClass = NSClassFromString(typeName) as? SomeGenericType.Type{
      b = someClass.init()
}

还应该对所有数据进行查询。目前我正在尝试将所有这些存储在本地,然后加载到内存并从代码中查询。我正在使用用户默认值,但它们有一些限制,我还需要提供自定义编码才能使其正常工作,每次添加新字段时,我都会发现我在编码时遗漏了一些内容并且无效。所以这很痛苦。

理想情况下,我会做一些魔术命令,所有对象都会被发送到本地存储,无论它们有多复杂。从这个存储中提取它们是一样的。此外,用户更改数据,因此我不能只存储主Json。而且我也不想将物品转回杰森,因为它也很痛苦。

有什么建议吗?

3 个答案:

答案 0 :(得分:0)

如果您想使用sqlite,那么您可以将整个对象存储在一行中!我的意思是你可以用2列创建表,一列是id,第二列是你的dataobject(它的数据类型应该是blob)。然后将整个对象转换为数据。然后存储在sqlite表中并将其作为数据检索,然后在想要使用时将其转换为对象。通过这种方式,您的对象将保持与您询问的格式相同

答案 1 :(得分:0)

用于在线同步和存储的

Firebase也可以在本地缓存所有内容,以防您离线并对本地缓存执行查询。它使用JSON。

CouchDB也有适用于iOS的移动版。

如果你的数据集很小,那么这两个都是过度杀戮;您可以将其存储为文本文件并重新读入JSON。请参阅性能特征here。该图表适用于7MB的文件,因此如果您的文件显着小于该文件,则加载时间可能会很短。

答案 2 :(得分:0)

NSKeyedArchiver.archivedData(withRootObject:)非常适合将自定义对象存储为Data个对象。要使用此功能,您唯一需要做的就是使自定义对象符合NSCoding。这里有一个很好的例子:

Save custom objects into NSUserDefaults

拥有对象的Data版本后,它可以轻松地存储在UserDefaults中,作为CoreData中的属性,甚至存储在应用程序的钥匙串条目中。根据您的使用情况,数据的敏感性以及您要存储的数据量,您可能希望使用任意数量的存储方法。 NSKeyedArchiver.archivedData(withRootObject:)允许您使用其中任何一个。