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
返回YES
,transformedValueClass
返回[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 属性吗?
如何在 Swift 中将可转换属性保存到 Core Data