Кодирование / декодирование удваивается с NSCoding - PullRequest
2 голосов
/ 08 января 2012

Как я могу использовать -[NSCoder encodeBytes:length:] и -[NSCoder decodeBytesWithReturnedLength:] с двойным?

У меня есть объект, соответствующий NSCoding с двумя double свойствами, и в настоящее время я использую NSNumber для кодирования / декодирования значений:

- (id)initWithCoder:(NSCoder *)decoder
{
  if (!(self = [super init]))
    return nil;

  latitude = [(NSNumber *)[decoder decodeObject] doubleValue];
  longitude = [(NSNumber *)[decoder decodeObject] doubleValue];

  return self;
}

- (void)encodeWithCoder:(NSCoder *)coder
{
  [coder encodeObject:[NSNumber numberWithDouble:latitude]];
  [coder encodeObject:[NSNumber numberWithDouble:longitude]];
}

Однако это дает мне неприемлемую производительность (6 секунд для декодирования с моими данными испытаний, что намного меньше, чем производственные данные).

Если бы я использовал ключи, я мог бы использовать -encodeDouble:forKey:, но я не использую ключи (они медленные), и в отличие от Mac OS X, в iOS нет метода -encodeDouble:.

Итак, мне нужно использовать encodeBytes:length: и decodeBytesWithReturnedLength:, но мои способности C довольно ограничены. Я не совсем уверен, как конвертировать между void * и double.

Ответы [ 3 ]

5 голосов
/ 08 января 2012
[coder encodeBytes:(void *)&latitude length:sizeof latitude];

NSUInteger length;
latitude = *(double *)[coder decodeBytesWithReturnedLength:&length];

Вы можете передать NULL вместо &length.

4 голосов
/ 08 января 2012

вам просто нужно сделать что-то вроде:

[coder encodeBytes:(void *)&latitude length:sizeof(double)];

тогда:

double latitude = *(double *)([coder decodeBytesWithReturnedLength:NULL]);

Обновлено: пропуск NULL для декодирования

3 голосов
/ 15 апреля 2013
    [encoder encodeDouble:lat forKey:@"latitude"];
    [encoder encodeDouble:lng forKey:@"longitude"];

    double lat = [decoder decodeDoubleForKey:@"latitude"];
    double lng = [decoder decodeDoubleForKey:@"longitude"];
...