Я пытаюсь передать массив пользовательских объектов из 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
Благодарим вас за выделение этого несоответствия. К сожалению, все тот же вопрос. Если не NSKeyedArchiver, что вы используете? (Я попытался разобрать JSON прямо из watchkitextension, что хорошо работает на симуляторе, но время на физическом устройстве, поэтому теперь я возвращаюсь к сеансу синтаксического разбора с телефона, а затем передаю данные) – TPeter
NSPropertyListSerialization был одним из тех, что рекомендованы инженерами WatchConnectivity. Просто убедитесь, что вы используете только типы списков свойств (что похоже на вас). В основном вы бы добавили '- (NSDictionary *) dictRepresentation' и' - (id) initWithDictionaryRepresentation: (NSDictionary *) dictionaryRepresentation' в свой класс Person. – ccjensen
Если вы все еще сталкиваетесь с проблемой, у вас должна быть ошибка в другом месте вашего кода. Поскольку процесс рушится, вы должны получать отчеты об авариях, которые расскажут вам, где именно проблема. – ccjensen