簡體   English   中英

如何通過nsuserdefaults快速存儲自定義數據?

[英]How to store the custom data via nsuserdefaults in swift?

我正在用Swift開發。 我想通過nsuserdefaults存儲自定義數據。

我的自定義數據如下

ConnectedDevice.swift中

import UIKit
import Foundation


class ConnectedDevice {

    var name:String?

    var ConnectState:Bool=false

    var AlertState:Int=0

    var Battery:NSInteger=0

    var AlertStatus:Int!

}

ViewController.swift中

var userDefault = NSUserDefaults.standardUserDefaults()
var ConnDevice:[ConnectedDevice] = [ConnectedDevice]()

當我嘗試存儲數據時,我使用以下代碼:

userDefault.setValue(ConnDevice, forKey: "ConnectedDevice")
userDefault.synchronize()

當我嘗試加載數據時,我使用以下代碼:

var test = userDefault.objectForKey("ConnectedDevice")
if((test) != nil){
    ConnDevice = test as! [ConnectedDevice]
}

但是當我嘗試通過nsuserdefaults存儲數據時,它顯示如下錯誤日志。 似乎數據類型無效。

2016-08-24 17:17:50.315 Anti-Lost[471:212884] Attempt to set a non-property-list object (
    "Anti_Lost.ConnectedDevice"
) as an NSUserDefaults/CFPreferences value for key ConnectedDevice
2016-08-24 17:17:50.318 Anti-Lost[471:212884] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
    "Anti_Lost.ConnectedDevice"
) for key ConnectedDevice'

我錯過了什么嗎? 如何通過nsuserdefaults快速存儲自定義數據? - - - - - - - - - - - - - - - - - 編輯 - - - - - - - - ------------------

我將代碼修改如下:

ConnectedDevice.swift中

import UIKit
import Foundation
import CoreBluetooth
import CoreLocation

class ConnectedDevice : NSObject , NSCoding{

    var RSSI_threshold:NSNumber=0

    var Current_RSSI:NSNumber=0

    var name:String?

    var bdAddr:NSUUID?

    var ConnectState:Bool=false

    var AlertState:Int=0

    var BLEPeripheral : CBPeripheral!

    var DisconnectAddress:[String] = [String]()

    var DisconnectTime:[String] = [String]()

    var Battery:NSInteger=0

    var Location:[CLLocation] = [CLLocation]()

    var AlertStatus:Int!



    func encodeWithCoder(aCoder: NSCoder) {

        aCoder.encodeObject(RSSI_threshold, forKey: "RSSI_threshold")
        aCoder.encodeObject(Current_RSSI, forKey: "Current_RSSI")
        aCoder.encodeObject(name, forKey: "name")
        aCoder.encodeObject(bdAddr, forKey: "bdAddr")
        aCoder.encodeBool(ConnectState, forKey: "ConnectState")
        aCoder.encodeInteger(AlertState, forKey: "AlertState")
        aCoder.encodeObject(BLEPeripheral, forKey: "BLEPeripheral")
        aCoder.encodeObject(DisconnectAddress, forKey: "DisconnectAddress")
        aCoder.encodeObject(DisconnectTime, forKey: "DisconnectTime")
        aCoder.encodeObject(Battery, forKey: "Battery")
        aCoder.encodeObject(Location, forKey: "Location")
        aCoder.encodeObject(AlertStatus, forKey: "AlertStatus")


    }

    override init() {


    }

    required init?(coder aDecoder: NSCoder) {

        self.RSSI_threshold = aDecoder.decodeObjectForKey("RSSI_threshold") as! NSNumber
        self.Current_RSSI = aDecoder.decodeObjectForKey("Current_RSSI") as! NSNumber
        self.name = aDecoder.decodeObjectForKey("name") as? String
        self.bdAddr = aDecoder.decodeObjectForKey("bdAddr") as? NSUUID
        self.ConnectState = aDecoder.decodeObjectForKey("ConnectState") as! Bool
        self.AlertState = aDecoder.decodeObjectForKey("AlertState") as! Int
        self.BLEPeripheral = aDecoder.decodeObjectForKey("BLEPeripheral") as! CBPeripheral
        self.DisconnectAddress = aDecoder.decodeObjectForKey("DisconnectAddress") as! [String]
        self.DisconnectTime = aDecoder.decodeObjectForKey("DisconnectTime") as! [String]
        self.Battery = aDecoder.decodeObjectForKey("Battery") as! NSInteger
        self.Location = aDecoder.decodeObjectForKey("Location") as! [CLLocation]
        self.AlertStatus = aDecoder.decodeObjectForKey("AlertStatus") as! Int
    }
}

我使用以下代碼存儲數據

let data = NSKeyedArchiver.archivedDataWithRootObject(ConnectedDevice)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "ConnectedDevice")

但是它將在aCoder.encodeObject(BLEPeripheral, forKey: "BLEPeripheral")處顯示錯誤,並且錯誤日志為

2016-08-24 18:37:57.022 Anti-Lost[476:222607] -[CBPeripheral encodeWithCoder:]: unrecognized selector sent to instance 0x14e9fc60
2016-08-24 18:37:57.024 Anti-Lost[476:222607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CBPeripheral encodeWithCoder:]: unrecognized selector sent to instance 0x14e9fc60'

如何對CBPeripheral進行編碼?

您的課程必須符合NSCoding協議,這是我的一個應用程序中的一個小樣本:

class BarData: NSObject, NSCoding {
    let url: String
    let date: NSDate
    var isFavorite: Bool = false

    init(url: String, date: NSDate) {
        self.url = url
        self.date = date
    }

    //MARK: - NSCoding -
    @objc required init(coder aDecoder: NSCoder) {
        url = aDecoder.decodeObjectForKey("url") as! String
        date = aDecoder.decodeObjectForKey("date") as! NSDate
        isFavorite = aDecoder.decodeBoolForKey("isFavorite")
    }

    @objc func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(url, forKey: "url")
        aCoder.encodeObject(date, forKey: "date")
        aCoder.encodeBool(isFavorite, forKey: "isFavorite")
    }
}

嘗試使用userDefault.setObject(ConnDevice, forKey: "ConnectedDevice")而不是userDefault.setValue(ConnDevice, forKey: "ConnectedDevice")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM