Objective c 如何在核心数据中使用指针持久化c-struct
如何像GSL库中的结构一样持久化C类型: 核心数据中 作为一个例子,我想知道如何使用gsl_矩阵来实现。 它包含指针和嵌套结构Objective c 如何在核心数据中使用指针持久化c-struct,objective-c,core-data,attributes,Objective C,Core Data,Attributes,如何像GSL库中的结构一样持久化C类型: 核心数据中 作为一个例子,我想知道如何使用gsl_矩阵来实现。 它包含指针和嵌套结构 typedef struct { size_t size1; size_t size2; size_t tda; double * data; gsl_block * block; int owner; } gsl_matrix; typedef struct { size_t size; double
typedef struct
{
size_t size1;
size_t size2;
size_t tda;
double * data;
gsl_block * block;
int owner;
} gsl_matrix;
typedef struct
{
size_t size;
double *data;
}gsl_block;
编辑:
汤姆·哈林顿建议后的解决方案:
@interface Recipe : _Recipe
@property gsl_matrix* matrix_;
@end
@implementation Recipe
@synthesize matrix_ = _matrix_;
/**
* Called once in it's lifetime
* when the object is created.
*/
- (void)awakeFromInsert
{
[super awakeFromInsert];
_matrix_ = gsl_matrix_calloc(11, 7);
}
/**
* Called everytime the object
* is fetched from core-data.
*/
- (void)awakeFromFetch
{
[super awakeFromFetch];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:self.matrix];
unsigned long size1 = [unarchiver decodeInt64ForKey: @"size1"];
unsigned long size2 = [unarchiver decodeInt64ForKey: @"size2"];
_matrix_ = gsl_matrix_alloc(size1, size2);
_matrix_->tda = size2;
_matrix_->block->size = _matrix_->size1*_matrix_->size2;
_matrix_->owner = [unarchiver decodeIntForKey:@"owner"];
int savedEndianess = [unarchiver decodeIntForKey:@"endianess"];
NSUInteger length;
if (savedEndianess != currentEndianess()) {
NSSwappedDouble *sw = (NSSwappedDouble *)[unarchiver decodeBytesForKey:@"data"
returnedLength:&length];
for (int i = 0; i < _matrix_->block->size ; ++i) {
_matrix_->data[i] = NSConvertSwappedDoubleToHost(sw[i]);
}
}
else{
_matrix_->data = (double *)[unarchiver decodeBytesForKey:@"data"
returnedLength: &length];
}
}
- (void)willSave
{
NSMutableData *archivedGslMatrix = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archivedGslMatrix];
[archiver encodeInt64:_matrix_->size1
forKey:@"size1"];
[archiver encodeInt64:_matrix_->size2
forKey:@"size2"];
[archiver encodeInt: currentEndianess() forKey:@"endianess"];
[archiver encodeBytes:(u_int8_t *)_matrix_->data
length:sizeof(*(_matrix_->data))*_matrix_->block->size
forKey:@"data"];
[archiver encodeInt64:_matrix_->owner
forKey:@"owner"];
[archiver finishEncoding];
}
@接口配方:\u配方
@属性gsl_矩阵*矩阵;
@结束
@实现方法
@合成矩阵=_矩阵;
/**
*一生只打过一次电话
*创建对象时。
*/
-(无效)从插入中唤醒
{
[super awakeFromInsert];
_矩阵=gsl矩阵(11,7);
}
/**
*每次调用对象时
*从核心数据中提取。
*/
-(void)awakeFromFetch
{
[super awakeFromFetch];
NSKeyedUnarchiver*unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:self.matrix];
无符号长size1=[unarchiver decodeInt64ForKey:@“size1”];
无符号长size2=[unarchiver decodeInt64ForKey:@“size2”];
_矩阵=gsl矩阵(尺寸1,尺寸2);
_矩阵->tda=尺寸2;
_矩阵->块->大小=\u矩阵->大小1*\u矩阵->大小2;
_矩阵->所有者=[unarchiver decodeIntForKey:@“所有者”];
int savedEndianess=[unarchiver decodeIntForKey:@“endianness”];
整数长度;
if(savedEndianess!=currentEndianess()){
NSSwapedDouble*sw=(NSSwapedDouble*)[unarchiver decodeBytesForKey:@“数据”
returnedLength:&length];
对于(int i=0;i<\u矩阵->块->大小;++i){
_矩阵->数据[i]=nsconvertedswappeddoubletohost(sw[i]);
}
}
否则{
_矩阵->数据=(双*)[unarchiver decodeBytesForKey:@“数据”
returnedLength:&length];
}
}
-(无效)将保存
{
NSMutableData*archivedGslMatrix=[NSMutableData];
NSKeyedArchiver*archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:archivedGslMatrix];
[archiver encodeInt64:\u矩阵->大小1
福基:@“size1”];
[archiver encodeInt64:\u矩阵->大小2
福基:@“size2”];
[archiver encodeInt:currentEndianess()forKey:@“endianess”];
[archiver encodeBytes:(u_int8_t*)\u矩阵->数据
长度:sizeof(*(_矩阵->数据))*_矩阵->块->大小
福基:@“数据”];
[archiver encodeInt64:\u矩阵\u->所有者
福基:@“所有者”];
[archiver finishEncoding];
}
您需要编写一些自定义代码,将其转换为NSData,然后将其另存为托管对象的属性。可能最简单的方法是使用NSKeyedArchiver
/NSKeyedUnarchiver
。你可以这样做:
gsl_matrix currentMatrix = // ... passed in
NSMutableData *archivedGslMatrix = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:archivedGslMatrix];
[archiver encodeInt:currentMatrix.size1 forKey:@"size1"];
[archiver encodeBytes:currentMatrix.data length:LENGTH_HERE forKey:@"data"];
... etc ...
[archiver finishEncoding];
[myManagedObject setValue:archivedGslMatrix forKey:@"matrix"];
在另一端,通过
NSKeyedUnarchiver
反向执行该过程。请注意,在对数据等字段进行解码时,需要将字节复制到自己的malloc'ed内存中 所有领域。逐一地。您需要创建相应的NSManagedObject。