Ios 如何通过nsuserdefaults在swift中存储自定义数据,如CBPeripheral?

Ios 如何通过nsuserdefaults在swift中存储自定义数据,如CBPeripheral?,ios,swift,nsuserdefaults,nscoding,Ios,Swift,Nsuserdefaults,Nscoding,我在斯威夫特发展。我想通过nsuserdefaults存储自定义数据 我的自定义数据如下所示 在ConnectedDevice.swift中 在ViewController.swift中 当我尝试存储数据时,我使用以下代码: let data = NSKeyedArchiver.archivedDataWithRootObject(BLEConnectedDevice) NSUserDefaults.standardUserDefaults().setObject(data, f

我在斯威夫特发展。我想通过nsuserdefaults存储自定义数据

我的自定义数据如下所示

在ConnectedDevice.swift中

在ViewController.swift中

当我尝试存储数据时,我使用以下代码:

let data = NSKeyedArchiver.archivedDataWithRootObject(BLEConnectedDevice)
        NSUserDefaults.standardUserDefaults().setObject(data, forKey: "BLEConnectedDevice")
       userDefault.synchronize()
if let Data = NSUserDefaults.standardUserDefaults().objectForKey("BLEConnectedDevice") as? NSData {

    if let devcie = NSKeyedUnarchiver.unarchiveObjectWithData(Data) as? ConnectedDevice {

        print("NSUserDefaults = \(devcie.name)")

    }

}
当我尝试加载数据时,我使用以下代码:

let data = NSKeyedArchiver.archivedDataWithRootObject(BLEConnectedDevice)
        NSUserDefaults.standardUserDefaults().setObject(data, forKey: "BLEConnectedDevice")
       userDefault.synchronize()
if let Data = NSUserDefaults.standardUserDefaults().objectForKey("BLEConnectedDevice") as? NSData {

    if let devcie = NSKeyedUnarchiver.unarchiveObjectWithData(Data) as? ConnectedDevice {

        print("NSUserDefaults = \(devcie.name)")

    }

}
但是它会在aCoder.encodeObjectBLEPeripheral、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'
如何对CBR外围设备进行编码

我错过什么了吗? 如何通过nsuserdefaults在swift中存储自定义数据?

这是因为不实现NSCoding。因此,您将无法将BLEPeripheral对象归档到NSUserDefaults中

我认为最好的解决方案是直接存储您感兴趣的属性,如名称或标识符:

编辑:

我认为无论怎样,您都无法再次存储和构建您的CBP外围设备。Apple将CBP外围对象呈现为:


所以,这似乎非常合乎逻辑,您不能存储此对象,稍后再重新构建它。。。我认为最好的解决方案是存储blePeripal.identifier,然后使用CBCentralManager取回CBPeripal。您可以使用RetrievePeriphersWithiIdentifiers:方法执行此操作。我认为您永远不应该自己构建CBPeripal对象。

CBPeripal不符合NSCoding。你救不了它。您可能只想保存有关它的有趣信息,但不能这样存储。我还尝试self.blepipheral.name=aDecoder.decodeObjectForkeyBlepheraldName as!字符串,但它不能分配给属性:“name”是一个仅获取的PropertyInDect。我认为您无法从NSUserDefaults再次构建BLEPeripheral对象。当我们思考它时,它似乎是正常的否?我只是编辑了我的答案来解释为什么不应该直接存储和构建BlePeripal。这是正确的答案。仅存储标识符,然后使用CBCentralManager重新创建CBP外围设备。你就是这样做的!:
aCoder.encodeObject(BLEPeripheral.name, forKey: "BLEPeripheralName")
aCoder.encodeObject(BLEPeripheral.identifier, forKey: "BLEPeripheralIdentifier")