我无法弄清楚这一点。我读到的关于瞬态属性的内容告诉我,它们可以在未定义类型的对象模型中识别。但是编译器抱怨这个类型未知的错误。
来自Core Dat编程指南:
如果不支持的属性是对象,则在托管对象模型中将其类型指定为未定义,并且它是瞬态的。实现实体的自定义类时,无需为属性添加实例变量 - 您可以使用托管对象的私有内部存储。关于下面描述的实现的注意事项是它们缓存瞬态值。这使得访问价值更有效 - 它也是变更管理的必要条件。如果定义自定义实例变量,则应该在didTurnIntoFault中清除这些变量,而不是dealloc或finalize。
这是头文件:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class SearchTerms;
@interface SearchResult : NSManagedObject {
@private
}
@property (nonatomic, retain) NSString * lattitude;
@property (nonatomic, retain) NSString * details;
@property (nonatomic, retain) NSString * endTime;
@property (nonatomic, retain) NSString * longitude;
@property (nonatomic, retain) NSString * city;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * imageLink;
@property (nonatomic, retain) NSString * startTime;
@property (nonatomic, retain) UNKNOWN_TYPE coordinate;
@property (nonatomic, retain) UNKNOWN_TYPE subtitle;
@property (nonatomic, retain) SearchTerms * searchUsed;
@end
我正在尝试使用标题,副标题和坐标来包含MKAnnotation的属性。在这里,我需要从其他字段派生字幕,并从经度和纬度导出坐标。
我不确定如何调和指南所说的内容以及看起来完全错误的内容,编译器也这样说。
一旦我得到了正确的标题,我可能能够正确实现,我将使用awakeFromFault来设置值。我不确定是否需要使用didTurnIntoFault释放字幕,这将是一个NSString,但这似乎是指南所说的。
我还没有看到如何实现简单瞬态属性的非常好的示例。我很想将jsut添加到托管对象实体中,而忘记在托管对象模型中提及它。但是,如果我这样做,我似乎会忽略一些东西。
答案 0 :(得分:2)
您需要将属性的类型更改为id
或任何最合适的类型:
@interface SearchResult : NSManagedObject
{}
@property (nonatomic, retain) id coordinate;
@end
另一种处理方法是通过KVC和依赖键:
@implementation SearchResult
+ (NSSet *) keyPathsForValuesAffectingCoordinate
{
return [NSSet setWithObjects:@"latitude", @"longitude", nil];
}
- (id) coordinate
{
// Derive the coordinate value
}
@end
答案 1 :(得分:1)
这里的问题是MKAnnotation协议将其coordinate
值存储在CLLocationCoordinate2D
中,它不是对象而是结构,并且它不支持键值编码。要将其用作过渡属性,您需要将其包装在对象中。
The Core Data Programming Guide: Scalar Value Constraints
如果要使用不属于其中的标量类型或结构 由Core Data直接支持,而不是其中一个结构 通过键值编码支持,您必须将其存储在托管中 对象作为对象 - 通常是NSValue实例,尽管你可以 还定义了自己的自定义类。然后,您将其视为一个对象 值,如本文后面所述。这取决于用户 从NSValue(或自定义)中提取所需结构的对象 检索值时的对象,以及将结构转换为 设置值时的NSValue(或自定义)对象。