Swift - 使用NSKeyedArchiver保存用户数据,转换为NSArray

时间:2016-07-15 20:45:57

标签: ios arrays swift nsuserdefaults nskeyedarchiver

所以我有一系列自定义对象。当我尝试将阵列保存到NSUserDefaults时,我必须将它们存档。以下是我要归档自定义对象数组的内容:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    //3

    var allMessages = defaults.objectForKey(UserDefaultsMesssageKey) as! [AddMessageViewController.harassText]
    var aMessage = AddMessageViewController.harassText(phoneNumber: 0, message: "1", frequency: 1, active: 1)
    allMessages.append(aMessage)
    saveMessage(allMessages)


    return (allMessages.count)
}

func archiveMessage(message:[AddMessageViewController.harassText]) -> NSData {
    let archivedObject = NSKeyedArchiver.archivedDataWithRootObject(message as NSArray)
    return archivedObject
}
func saveMessage(messages: [AddMessageViewController.harassText]) {
    let archivedObject = archiveMessage(messages)
    defaults.setObject(archivedObject, forKey: UserDefaultsMesssageKey)
    defaults.synchronize()
}
func retrieveData()-> [AddMessageViewController.harassText]? {
    if let unarchiveObject = NSUserDefaults.standardUserDefaults().objectForKey(UserDefaultsMesssageKey) as? NSData {
        return NSKeyedUnarchiver.unarchiveObjectWithData(unarchiveObject) as? [AddMessageViewController.harassText]
    }
    return nil
}

流程是:

  1. 在saveMessage调用中,传递自定义数组以获取存档。这是数组对GDB的看法。你可以看到它是一个数组,它包含1个类对象。

    ([Harass_Your_Kate.AddMessageViewController.harassText]) $R0 = 1 value { [0] = 0x00007fa5ab409600 { ObjectiveC.NSObject = { isa = Harass_Your_Kate.AddMessageViewController.harassText } phoneNumber = 0 message = "1" frequency = 1 active = 1 } }

  2. 数组传递给archiveMessage。代码在NSKeyedArchiver方法上立即失败。错误消息如下:

    [_TtCC16Harass_Your_Kate24AddMessageViewController10harassText encodeWithCoder:]: unrecognized selector sent to instance 0x7fa5ab409600
    

    2016-07-15 16:31:26.019 Harass Your Kate [5858:7847495] * - [NSKeyedArchiver dealloc]:警告:NSKeyedArchiver在没有调用-finishEncoding的情况下取消分配。 2016-07-15 16:31:26.023骚扰你的凯特[5858:7847495] * 由于未捕获的异常终止应用程序' NSInvalidArgumentException',原因:' - [_ TtCC16Harass_Your_Kate24AddMessageViewController10harassText encodeWithCoder:] :无法识别的选择器发送到实例0x7fa5ab409600

  3. 我感谢所有的帮助,提前谢谢你!

    编辑:这是我的对象的定义:

    class Text : NSObject {
        var phoneNumber = 0             //Text address to send to
        var message: String = ""        //Message to be sent
        var frequency = 24              //Number of hours between messages (usually a multiple of 24 - 24 = daily)
        var active = 0                  // 0 if cancelled, 1 if active
    
        init(phoneNumber: Int, message: String, frequency: Int, active: Int ){
            self.phoneNumber = phoneNumber
            self.message = message
            self.frequency = frequency
            self.active = active
        }
    }
    

1 个答案:

答案 0 :(得分:3)

SELECT A.ID#, C.Customer, E.EventID# INTO #TEMP FROM IDTable A INNER JOIN CustomerTable C ON C.AccountID = A.AccountID INNER JOIN EventTable E ON E.AccountType = C.AccountType WHERE C.StatusID = 'Active' ; SELECT A.ID#, A.Customer, A.EventID# FROM #TEMP A INNER JOIN #TEMP A2 ON A.Customer = A2.Customer AND A.EventID# = A2.EventID# AND A.ID# <> A2.ID# 通过利用必须通过符合NSKeyedArchiver协议提供的方法来序列化对象。它无法自动推断如何保存自定义类;你必须自己实现如下:

NSCoding

如您所见,初始化程序从编码器读取并创建和实例,而class Text : NSObject, NSCoding { var phoneNumber = 0 //Text address to send to var message: String = "" //Message to be sent var frequency = 24 //Number of hours between messages (usually a multiple of 24 - 24 = daily) var active = 0 // 0 if cancelled, 1 if active init(phoneNumber: Int, message: String, frequency: Int, active: Int ){ self.phoneNumber = phoneNumber self.message = message self.frequency = frequency self.active = active } required init?(coder aDecoder: NSCoder) { phoneNumber = aDecoder.decodeInteger(forKey: "phoneNumber") message = aDecoder.decodeObject(forKey: "message") as! String frequency = aDecoder.decodeInteger(forKey: "frequency") active = aDecoder.decodeInteger(forKey: "active") } func encode(with aCoder: NSCoder) { aCoder.encode(phoneNumber, forKey: "phoneNumber") aCoder.encode(message, forKey: "message") aCoder.encode(frequency, forKey: "frequency") aCoder.encode(active, forKey: "active") } } 方法将相关信息保存到编码器。在像这样的简单类中,它们的实现可能看起来很明显,但在更复杂的自定义类型中,要做出非平凡的编码决策。

相关问题