2015-08-03 2 views
-1

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

структура

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 под названием 'Счет' со свойством 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; 
} 

ответ

0

Вы текущий код кодирования имеет ошибку. Предоставляемые вами данные для 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"]; 
} 
0

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

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

+0

Он имеет несколько полей указатель на структуру. Это может быть проблемой, если вы просто кодируете структуру как блок памяти. –

Смежные вопросы