iOS Swift 将领域对象存储到 UserDefaults.standard

Posted

技术标签:

【中文标题】iOS Swift 将领域对象存储到 UserDefaults.standard【英文标题】:iOS Swift Storing Realm Object to UserDefaults.standard 【发布时间】:2017-04-07 08:51:16 【问题描述】:

这是我的领域对象:

PracticeAreaEntity 
    id = 0;
    c_id = 21871;
    c_number = C.C/1/2016;
    c_title = Title Here;
    date = 2017-04-07T00:00:00.000Z;
    description2 = ;
    object = "id":205039,"c_id":21871,"name":"07-04-2017","s_time":"2017-04-07T00:00:00.000Z","e_time":"2017-04-08T00:00:00.000Z","creator":"system","created_by_id":null,"description":null,"c_at":"2017-03-26T00:11:52.134Z","u_at":"2017-04-07T01:00:27.396Z","judge":null,"phearing":null,"google_event_id":null,"is_completed":false,"business":null,"last_notified":"2017-04-07T01:00:27.382Z","ng_date":null,"b_date":null,"b_d_available":false;
    p_id = 205039;
    subject = 07-04-2017;
    type = Event;

我需要将此领域对象存储到 UserDefault.standard 并在另一个页面中取回值。这是我的 UserDefults 代码:

let userDefaults = UserDefaults.standard
userDefaults.set(filteredtotalContactArray[indexPath.row], forKey: "SelectedPractice")
userDefaults.synchronize()

filteredtotalContactArray[indexPath.row] 等于我之前指定为领域对象的值。但我收到错误

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object 

【问题讨论】:

为什么在使用Realm 时尝试将对象存储在UserDefault 中?这是一个不好的做法,另外,将自定义对象存储在UserDefault 需要面对NSCoding 协议,这会将您的对象转换为数据 在表格视图中,我正在显示我的领域中的对象列表。我需要将选定的索引 path.row 值存储到 UserDefaults.standard 我们无法直接存储自定义对象,您需要了解 Keyarchiver 概念 看到这个***.com/questions/37980432/… 我也试过了。这是存储值的代码:let userDefaults = UserDefaults.standard let encodedData = NSKeyedArchiver.archivedData(withRootObject: (filteredtotalContactArray[indexPath.row] as AnyObject)) userDefaults.set(encodedData, forKey: "SelectedPractice") userDefaults.synchronize() 但它不起作用 【参考方案1】:

您需要为您的领域模型提供NSCoding 的一致性方法,以便能够将它们持久化到UserDefaults

但是,鉴于您已经在应用中使用 Realm,我建议您使用 Realm 来持久化 Realm 模型。

【讨论】:

以上是关于iOS Swift 将领域对象存储到 UserDefaults.standard的主要内容,如果未能解决你的问题,请参考以下文章

使用swift存储数据而不在领域中制作模型

如何将推送通知令牌存储到外部数据库 - iOS 10,Swift 3

Swift 4 可编码领域对象子类

FIREBASE 数据库 - 将唯一密钥存储到子节点(Swift/IOS)

iOS Swift将GPS坐标存储到数组中

领域 Swift 错误:无法直接创建嵌入式对象