【发布时间】:2015-03-14 03:36:33
【问题描述】:
我继承了一些手绘代码,它记录了 CGPathRef 的点,然后将其转换为 CGPoints 的集合,最终以 NSData 的形式保存在我们的核心数据数据库中。
当前的转换代码如下所示:
@interface StoredPath : NSObject
{
CGPathRef path;
}
@implementation StoredPath
- (NSArray *)getPoints
{
// Convert path to an array
NSMutableArray *a = [NSMutableArray arrayWithObject:[NSNumber numberWithBool:YES]];
CGPathApply(path, (__bridge void *)(a), saveApplier);
if (![[a objectAtIndex:0] boolValue])
{
return nil;
}
[a removeObjectAtIndex:0];
return (a);
}
static void saveApplier(void *info, const CGPathElement *element)
{
NSMutableArray *a = (__bridge NSMutableArray*) info;
int nPoints;
switch (element->type)
{
case kCGPathElementMoveToPoint:
nPoints = 1;
break;
case kCGPathElementAddLineToPoint:
nPoints = 1;
break;
case kCGPathElementAddQuadCurveToPoint:
nPoints = 2;
break;
case kCGPathElementAddCurveToPoint:
nPoints = 3;
break;
case kCGPathElementCloseSubpath:
nPoints = 0;
break;
default:
[a replaceObjectAtIndex:0 withObject:[NSNumber numberWithBool:NO]];
return;
}
NSNumber *type = [NSNumber numberWithInt:element->type];
NSData *points = [NSData dataWithBytes:element->points length:nPoints*sizeof(CGPoint)];
[a addObject:[NSDictionary dictionaryWithObjectsAndKeys:type, @"type", points, @"points", nil]];
}
@end
这里要注意的重要部分是这一行:
NSData *points = [NSData dataWithBytes:element->points length:nPoints*sizeof(CGPoint)];
它将CGPoint 数据保存到一个紧凑的NSData 对象中,然后保存在我们的核心数据数据库中。
当应用程序的数据仅存在于单个设备上时,这很好。但现在这些数据已同步到其他设备,由于CGFloat(构成CGPoint 结构)在各种 iOS 设备上是 32 位或 64 位,它会崩溃。
在 64 位 iOS 设备上读取 32 位 NSData of CGPoints 时,字节不完全对齐并且绘图被破坏。当然,反之亦然(在 32 位 iOS 设备上读取 64 位 NSData of CGPoints)。
我一直在努力重构这个saveApplier: 方法,使其独立于平台并且可以轻松保存在核心数据中。
更新:
我正在考虑将这些点打包成一个"|" 分隔的字符串。
示例:pointsToSave = {442, 797.5}|{442, 797.5}|{442, 797.5}
NSString *pointsToSave = [[NSString alloc] init];
// Convert CGPoint's to a "|" separated string.
for (int i=0; i<nPoints; i++)
{
pointsToSave = [pointsToSave stringByAppendingString:NSStringFromCGPoint(element->points[i])];
if ((i+1)<nPoints)
{
pointsToSave = [pointsToSave stringByAppendingString:@"|"];
}
}
它也使得平台之间的解析变得相当简单。
想法?
【问题讨论】:
标签: ios objective-c core-data 64-bit cgpoint