Как правильно передать NSMutableArray в NSUserDefaults с пользовательской моделью данных?

Позвольте мне предвосхитить, что мой код был специально скрыт. Я знаю, что имя не будет хорошим. Я пытаюсь добавить виджет в свое приложение с новой функциональностью iOS 8. Я использую эту ссылку в качестве учебника

Теперь, пока у меня есть это в моем ViewController, когда моя кнопка отправки вызывается в моем приложении. К этому времени все мои данные в этом массиве будут переданы.

//Passes the array of times to the shared group to be called by the notification center widget.
NSUserDefaults *sharedDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.myGroup.TodayExtensionSharingDefaults"];
NSData *encodedArray = [NSKeyedArchiver archivedDataWithRootObject:tableViewController.TimeArray];
[sharedDefaults setObject:encodedArray  forKey:@"TimesArray"];
[sharedDefaults synchronize];

Однако в моем массиве хранится пользовательская модель данных, которую я создал, поэтому в моей модели данных есть:

- (void)encodeWithCoder:(NSCoder *)encoder {
    //Encode properties, other class variables, etc
    [encoder encodeInt:_stopNumber forKey:@"stopNumber"];
    [encoder encodeObject:_route forKey:@"route"];
    [encoder encodeObject:_number forKey:@"number"];
    [encoder encodeInt:_time forKey:@"time"];
    [encoder encodeObject:_minutesOrApproaching forKey:@"@minutesOrApproaching"];
    [encoder encodeObject:_noPrediction forKey:@"noPrediction"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if(self) {
        //decode properties, other class vars
        _stopNumber = [decoder decodeIntForKey:@"stopNumber"];
        _route = [decoder decodeObjectForKey:@"route"];
        _number = [decoder decodeObjectForKey:@"number"];
        _time = [decoder decodeIntForKey:@"time"];
        _minutesOrApproaching = [decoder decodeObjectForKey:@"minutesOrApproaching"];
        _noPrediction = [decoder decodeObjectForKey:@"noPrediction"];
    }
    return self;
}

И тогда в моем виджете у меня есть этот код, который называется:

NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.myGroup.TodayExtensionSharingDefaults"];
    NSData *myDecodedObject = [defaults objectForKey: @"TimesArray"];
    NSArray *decodedArray =[NSKeyedUnarchiver unarchiveObjectWithData: myDecodedObject];

    int i = 0;
    for (ETA *eta in decodedArray) {
        if(i == 0){
            _stopNumber.text = eta.number;
        }
        UILabel *label = [timeSlots objectAtIndex:i];
        label.text = eta.minutesOrApproaching;
        i++;
    }

Моя проблема в том, что я продолжаю получать:

* Завершение работы приложения из-за необработанного исключения "NSInvalidUnarchiveOperationException", причина: '* - [NSKeyedUnarchiver decodeObjectForKey:]: невозможно декодировать объект класса (ETA) ", введите код здесь

Так что я немного расстроен, потому что я не знаю, что я делаю здесь неправильно. Было бы здорово, если бы кто-то помог мне направить меня в правильном направлении. Еще раз спасибо!

1 ответ

Таким образом, прохождение пользовательских классов может быть болезненным. И хотя весь код кажется правильным, я все еще получаю сообщение об ошибке. Поэтому я отступил, посмотрел на свой предмет и спросил себя: "Что мне действительно нужно от этого?" и, используя этот процесс, решил, что мне нужны только определенные значения, поэтому я зашифровал только эти значения, а не объект. Поскольку эти значения были целыми числами и строками, они встроены в iOS для того, как кодировать и декодировать. Оттуда я смог передать значения благодаря ответу @ meda и моей идее.

Другие вопросы по тегам