NSCoding a c struct object, который является свойством класса

У меня есть класс под названием Account с 6 свойствами, и одним из свойств является ac struct. Я не могу понять, как использовать NSCoding для соответствия структуре. Как бы я пошел о кодировании и декодировании свойства c struct. Структура имеет тип app_config_t.

структура

typedef struct app_config_t
{
    pj_pool_t               *pool;

    pjsua_config            cfg;
    pjsua_logging_config    log_cfg;
    pjsua_media_config      media_cfg;

    pjsua_transport_config  udp_cfg;
    pjsua_transport_config  rtp_cfg;


    pj_bool_t               ringback_on;
    pj_bool_t               ring_on;

    int                     ringback_slot;
    int                     ringback_cnt;
    pjmedia_port            *ringback_port;

    int                     ring_cnt;
    SystemSoundID           ring_id;
    CFRunLoopTimerRef       ring_timer;
} app_config_t;

Класс Objective C под названием 'Account' со свойством App_config

#pragma mark - NSCoding
- (void) encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.Username forKey:@"username"];
    [aCoder encodeObject:self.Password forKey:@"password"];
    [aCoder encodeObject:self.Server forKey:@"server"];

    [aCoder encodeInt:self.Account_id forKey:@"Account_id"];
    [aCoder encodeInt:self.Call_id forKey:@"Call_id"];

    //trying to save this object, is this even correct
    NSMutableData *data = [NSMutableData dataWithBytes:&_App_config length:sizeof(app_config_t)];
    NSKeyedArchiver *App_config_Archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [aCoder encodeObject:App_config_Archiver forKey:@"App_config"];
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init])
    {
        self.Username = [aDecoder decodeObjectForKey:@"username"];
        self.Password = [aDecoder decodeObjectForKey:@"password"];
        self.Server = [aDecoder decodeObjectForKey:@"server"];

        self.Account_id = [aDecoder decodeIntForKey:@"Account_id"];
        self.Call_id = [aDecoder decodeIntForKey:@"Call_id"];

        self.App_config = ?????????

    }

    return self;
}

2 ответа

Ваш текущий код кодирования имеет ошибку. Изменяемые данные, которые вы предоставляете NSKeyedArchiver используется архиватором для хранения закодированных данных. Итак, копирование app_config_t структура бесполезна.

Вам нужно закодировать каждое поле вашей структуры с помощью NSKeyedArchiver, У него есть кодеры для примитивных типов. Также в app_config_t Структура Я вижу поля, которые не являются примитивными типами, но сложные типы. Так что для таких полей вам также нужна пользовательская кодировка.

- (void) encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.Username forKey:@"username"];
    [aCoder encodeObject:self.Password forKey:@"password"];
    [aCoder encodeObject:self.Server forKey:@"server"];

    [aCoder encodeInt:self.Account_id forKey:@"Account_id"];
    [aCoder encodeInt:self.Call_id forKey:@"Call_id"];

    // this data will have encoded structure
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *App_config_Archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    // for all fields from structure you need to use such encoders
    [App_config_Archiver encodeBool:_App_config.ringback_on forKey:@"ringback_on"];

    // encode data itself
    [aCoder encodeObject:data forKey:@"App_config"];
}

Вы должны иметь возможность рассматривать структуру как буфер памяти и использовать для этого функцию encodeBytes NSCoder:

- (void)encodeBytes:(const void * _Nullable)byteaddr length:(NSUInteger)length

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