-primitiveValueForKey: 的意义何在?
Posted
技术标签:
【中文标题】-primitiveValueForKey: 的意义何在?【英文标题】:What's the point of -primitiveValueForKey:? 【发布时间】:2010-11-10 17:09:06 【问题描述】:-setPrimitiveValue:forKey:
不会触发 KVO 通知。但在我的脑海中,KVO 只有在发生变化时才有意义。但是,当我只访问它以进行读取时,如何更改某些内容呢?
-primitiveValueForKey:
只获取某个键的对象。但它不会修改它。那么为什么在使用-valueForKey:
时会/可能会导致 KVO 通知?
(当然有一点,但我还没有看到。)
【问题讨论】:
请将已回答的问题标记为已回答,或者如果您有不明白的地方,请在答案的 cmets 中提问。谢谢! 【参考方案1】:-primitiveValueForKey:
和 -setPrimitiveValue:forKey:
方法主要由 Core Data 使用。特别是,Core Data 不仅需要知道您何时要修改属性;它也需要知道你什么时候访问它,这样它才能实现故障。
因此,Core Data 添加了-will,didAccessValueForKey:
方法以在getter 中使用,就像-will,didChangeValueForKey:
方法在setter 中用作KVO 挂钩一样。
但是,还有另一个问题:Core Data 实际上也为您管理建模属性的底层存储。因此,您需要一些方法来操作此底层存储在-will,didAccess,ChangeValueForKey:
方法建立的障碍。这就是-primitiveValueForKey:
和-setPrimitiveValue:forKey:
的用武之地。
这就是为什么在 @property
和 @dynamic
存在之前实现核心数据 getter 和 setter 的标准模式如下所示:
// Person.m
#import "Person.h"
@implementation Person
- (NSString *)name
[self willAccessValueForKey:@"name"];
NSString *value = [self primitiveValueForKey:@"name"];
[self didAccessValueForKey:@"name"];
- (void)setName:(NSString *)value
[self willChangeValueForKey:@"name"];
[self setPrimitiveValue:value forKey:@"name"];
[self didChangeValueForKey:@"name"];
@end
当然,如果您希望 Core Data 在运行时为您生成这些内容,您可以只声明一个属性并将其定义为 @dynamic
:
// Person.h
@interface Person : NSManagedObject
@property (nonatomic, readwrite, copy) NSString *name;
@end
// Person.m
#import "Person.h"
@implementation Person
@dynamic name;
@end
在某些情况下,您仍然希望在没有 KVO 或故障触发的情况下操作底层存储。因此,Core Data 也提供了一种新的方法来解决这个问题,它也是围绕属性声明和自动综合构建的:
// Person.h
@interface Person : NSManagedObject
@property (nonatomic, readwrite, copy) NSString *name;
@end
// Person.m
#import "Person.h"
@interface Person ()
@property (nonatomic, readwrite, copy) NSString *primitiveName;
@end
@implementation Person
@dynamic name;
@dynamic primitiveName;
@end
请注意,我将类延续放在 .m 文件中;这不是 Person 之外的代码(甚至是 -awakeFromInsert
和 -awakeFromFetch
之外的真正代码)应该触及的东西。但它确实让我无需在我的代码中嵌入文字字符串并使用真实类型即可获得“名称”属性的底层存储。
【讨论】:
以上是关于-primitiveValueForKey: 的意义何在?的主要内容,如果未能解决你的问题,请参考以下文章