2015-10-19 5 views
0

Я пытаюсь передать массив пользовательских объектов из iOS в watchkitextension.передать массив пользовательских объектов с WatchConnectivity/encoding в Swift

Понял, что для этого данные должны быть закодированы. Хотя ошибка при декодировании.

Здесь мы идем:

Обычай объект:

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 

ответ

0

Попробуйте изменить эти разделы:

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) 
} 

Так что сериализации соответствуют десериализации, и типов, желаемой Класс человека. Тем не менее, разговоры WWDC о WatchConnectivity специально рекомендовали не использовать NSKeyedArchiver, так как это не очень эффективный метод сериализации.

+0

Благодарим вас за выделение этого несоответствия. К сожалению, все тот же вопрос. Если не NSKeyedArchiver, что вы используете? (Я попытался разобрать JSON прямо из watchkitextension, что хорошо работает на симуляторе, но время на физическом устройстве, поэтому теперь я возвращаюсь к сеансу синтаксического разбора с телефона, а затем передаю данные) – TPeter

+0

NSPropertyListSerialization был одним из тех, что рекомендованы инженерами WatchConnectivity. Просто убедитесь, что вы используете только типы списков свойств (что похоже на вас). В основном вы бы добавили '- (NSDictionary *) dictRepresentation' и' - (id) initWithDictionaryRepresentation: (NSDictionary *) dictionaryRepresentation' в свой класс Person. – ccjensen

+0

Если вы все еще сталкиваетесь с проблемой, у вас должна быть ошибка в другом месте вашего кода. Поскольку процесс рушится, вы должны получать отчеты об авариях, которые расскажут вам, где именно проблема. – ccjensen