编码/解码使用NSCoding加倍

时间:2012-01-07 21:54:25

标签: objective-c ios double nscoding

如何使用-[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:方法。 / p>

所以,我需要使用encodeBytes:length:decodeBytesWithReturnedLength:,但我的C能力非常有限。我不确定如何在void *double之间进行转换。

3 个答案:

答案 0 :(得分:5)

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

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

您可以通过NULL代替&length

答案 1 :(得分:4)

你应该只需要做一些事情:

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

然后:

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

更新:传递NULL以解码

答案 2 :(得分:3)

    [encoder encodeDouble:lat forKey:@"latitude"];
    [encoder encodeDouble:lng forKey:@"longitude"];

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