Core Data 实体中的可转换属性可以是指向 c 结构的指针吗?我的变压器没有被调用

Posted

技术标签:

【中文标题】Core Data 实体中的可转换属性可以是指向 c 结构的指针吗?我的变压器没有被调用【英文标题】:Can transformable attributes in Core Data entities be pointers to c structs? My transformer is not being called 【发布时间】:2013-01-14 14:45:21 【问题描述】:

我正在尝试创建一个 CoreData 持久化实体。该实体有一些属性,其中之一是非标准属性 state。 state 属性是一个指向 C 结构的指针,其中包含一些属性。这是我的数据模型的样子:

实体:

MDInstance

属性:

持续时间:整数 16 移动:整数 16 名称:字符串 状态:可变形。我将 Transformer 设置为 MDStateTransformer。

我生成了我的类并编辑了 state 属性。界面是这样的:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import "MDState.h" // this is where the State structure is defined

@interface MDInstance : NSManagedObject

@property (nonatomic, retain) NSNumber * duration;
@property (nonatomic, retain) NSNumber * moves;
@property (nonatomic, retain) NSString * name;
@property (nonatomic) State *state; // note that this is a pointer to a struct

@end

这是实现的样子:

#import "MDInstance.h"

@implementation MDGameInstance

@dynamic duration;
@dynamic moves;
@dynamic name;

@synthesize state;

@end

我创建了一个名为 MDStateTransformer 的值转换器。实现这一点(可能)并不重要。我只想说我有allowsReverseTransformation 返回YEStransformedValueClass 返回[NSValue class],我已经实现了transformedValue:reverseTransformedValue:

最后,我在 AppDelegate 的application:didFinishLaunchingWithOptions: 中注册了 MDStateTransformer,如下所示:

MDStateTransformer *transformer = [[MDStateTransformer alloc] init];
[NSValueTransformer setValueTransformer:transformer forName:@"MDStateTransformer"];

如果我创建我的 MDInstance 的新实例,设置它的属性 - 包括状态属性 - 然后尝试保存实体,我的转换器永远不会被调用。

我在转换器的 init 方法中设置了一个停止点,它正在被实例化。我在transformedValue: 中放了另一个,它没有被调用。

但是,如果我更新我的 MDInstance 以使 state 属性不是指针,而只是一个 State 结构,并且我更新转换器以使用结构而不是指针,则调用 transformedValue:

是否可以在作为指向 c 结构的指针的对象上具有自定义属性?如果是这样,任何想法我做错了什么?

【问题讨论】:

【参考方案1】:

您的可转换属性还需要在您的实现文件中指定为@dynamic 而不是@synthesize。通过综合该属性,您可以在核心数据之外提供 getter 和 setter,因此不会使用 Core Data 提供的访问器。

【讨论】:

我不确定这是否完全正确。我进行了此更改,并在运行单元测试时看到以下输出: CoreData: error: Property 'setState:' is an scalar type on class 'MDGameInstance' 不匹配其实体属性的标量类型。 “动态生成的访问器不支持隐式类型强制。无法为其生成 setter 方法。”由于这是一个标量,也许我需要编写自己的 get/set 函数?如果是这样,我不确定如何为 CoreData 正确执行此操作。有什么想法吗? 我猜这意味着您不能在 Core Data 中使用带有 NSValueTransformer 的 C 结构指针。您必须自己在自定义 getter 和 setter 中进行转换。看看这个:developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…

以上是关于Core Data 实体中的可转换属性可以是指向 c 结构的指针吗?我的变压器没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 可以在 iOS 上延迟获取 BLOB 属性吗?

从一个复制并转换为 Core Data 中的另一个属性

如何在 Swift 中将可转换属性保存到 Core Data

在 Core Data 中进行重量级迁移时尝试迁移 nil 属性值

如何将实体上的属性迁移到 Core Data 中的实体

如何从 Core Data 中的关系相关实体获取属性?