【问题标题】:transfer array of custom objects with WatchConnectivity / encoding in Swift在 Swift 中使用 WatchConnectivity / 编码传输自定义对象数组
【发布时间】:2015-10-19 15:53:39
【问题描述】:

我正在尝试将一组自定义对象从 iOS 传输到 watchkitextension。

了解为了做到这一点,需要对数据进行编码。虽然解码时出错。

我们开始吧:

自定义对象:

    final class Person: NSObject {
        var PersonName:String = ""
        var PersonAge:Int = 0
        var joined:NSDate = NSDate()

        init(PersonName: String, PersonAge:Int, joined:NSDate){
            self.PersonName = PersonName
            self.PersonAge = PersonAge
            self.joined = joined
            super.init()
        }
    }

   extension Person: NSCoding {
        private struct CodingKeys {
            static let PersonName = "PersonName"
            static let PersonAge = "PersonAge"
            static let joined = "joined"
        }

        convenience init(coder aDecoder: NSCoder) {
            let PersonName = aDecoder.decodeObjectForKey(CodingKeys.PersonName) as! String
            let PersonAge = aDecoder.decodeIntForKey(CodingKeys.PersonAge) as! Int
            let joined = aDecoder.decodeDoubleForKey(CodingKeys.joined) as! NSDate

            self.init(PersonName: PersonName, PersonAge: PersonAge, joined: joined)
        }

        func encodeWithCoder(encoder: NSCoder) {
            encoder.encodeObject(PersonName, forKey: CodingKeys.PersonName)
            encoder.encodeObject(PersonAge, forKey: CodingKeys.PersonAge)
            encoder.encodeObject(joined, forKey: CodingKeys.joined)
        }
    }

带有数组的类:

@objc(Group)
final class Group: NSObject {

    static let sharedInstance = Group()

    var Persons:[Person] = []

    required override init() {
        super.init()
    }

    init (Persons:[Person]){
        self.Persons = Persons
        super.init()
    }

}

extension Group: NSCoding {
    private struct CodingKeys {
        static let Persons = "Persons"
    }

    convenience init(coder aDecoder: NSCoder) {

        let Persons = aDecoder.decodeObjectForKey(CodingKeys.Persons) as! [Person]
        self.init(Persons: Persons)

        self.Persons = aDecoder.decodeObjectForKey(CodingKeys.Persons) as! [Person]
    }

    func encodeWithCoder(encoder: NSCoder) {
        encoder.encodeObject(Persons, forKey: CodingKeys.Persons)
    }
}

创建示例对象,附加到数组,然后编码:

let aPerson:Person? = Person(PersonName: "Martin", PersonAge: 50, joined: NSDate())

Group.sharedInstance.Persons.append(aPerson!) 
let encodedData = NSKeyedArchiver.archivedDataWithRootObject(Group.sharedInstance)

在这里我得到错误“执行被中断 - 原因信号 SIGABRT”

let decodedData = NSKeyedUnarchiver.unarchiveObjectWithData(encodedData) as? Group

【问题讨论】:

    标签: swift2 encode nskeyedarchiver nscoder watchconnectivity


    【解决方案1】:

    尝试将这些部分更改为:

    convenience init(coder aDecoder: NSCoder) {
        let PersonName = aDecoder.decodeObjectForKey(CodingKeys.PersonName) as! String
        let PersonAge = aDecoder.decodeIntForKey(CodingKeys.PersonAge) as! Int
        let joined = aDecoder.decodeObjectForKey(CodingKeys.joined) as! NSDate
    
        self.init(PersonName: PersonName, PersonAge: PersonAge, joined: joined)
    }
    
    func encodeWithCoder(encoder: NSCoder) {
        encoder.encodeObject(PersonName, forKey: CodingKeys.PersonName)
        encoder.encodeInt(PersonAge, forKey: CodingKeys.PersonAge)
        encoder.encodeObject(joined, forKey: CodingKeys.joined)
    }
    

    使序列化与反序列化相匹配,以及 Person 类所需的类型。也就是说,WWDC 关于 WatchConnectivity 的演讲特别推荐不要使用 NSKeyedArchiver,因为它不是一种非常节省空间的序列化方法。

    【讨论】:

    • 感谢您强调这种不匹配。不幸的是仍然是同样的问题。如果不是 NSKeyedArchiver,你用什么? (我尝试直接从 watchkitextension 解析 JSON,它在模拟器上运行良好,但在物理设备上超时,因此现在恢复从手机解析,然后传递数据)
    • NSPropertyListSerialization 是 WatchConnectivity 工程师推荐的方法之一。只要确保只使用属性列表类型(看起来像你)。基本上你会在你的 Person 类中添加一个 -(NSDictionary *)dictRepresentation 和一个 -(id)initWithDictionaryRepresentation:(NSDictionary *)dictionaryRepresentation
    • 如果您仍然遇到问题,您的代码中的其他地方一定有错误。由于进程正在崩溃,您应该会生成崩溃报告,这将告诉您问题出在哪里。
    • 对不起 ccjensen,我还是 Swift 的新手。你如何/在哪里使用 NSPropertySerialization?
    猜你喜欢
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2020-11-12
    • 2019-02-23
    • 2023-03-12
    • 2020-05-30
    相关资源
    最近更新 更多