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