Objective c 如何在核心数据中使用指针持久化c-struct

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

如何像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 *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。