首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-primitiveValueForKey的意义是什么?

-primitiveValueForKey的意义是什么?
EN

Stack Overflow用户
提问于 2010-11-11 01:09:06
回答 1查看 3K关注 0票数 3

-setPrimitiveValue:forKey:不会触发KVO通知。但在我的大脑中,KVO只有在事情发生变化时才有意义。但是,当我只对其进行读访问时,如何更改它呢?

-primitiveValueForKey:只获取某个键的对象。但它不会修改它。那么,在使用-valueForKey:时,这为什么会/是否会导致KVO通知呢

(当然,这是有道理的,但我还看不出来。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-18 07:50:57

核心数据主要使用-primitiveValueForKey:-setPrimitiveValue:forKey:方法。特别是,Core Data不只需要知道您何时要修改属性;它还需要知道您何时要访问它,这样它就可以实现出错。

因此,核心数据添加了在getter中使用的-{will,did}AccessValueForKey:方法,就像-{will,did}ChangeValueForKey:方法在setter中用作KVO钩子一样。

然而,还有另一个问题:核心数据实际上也为您管理建模属性的底层存储。因此,您需要一些方法来在-{will,did}{Access,Change}ValueForKey:方法建立的屏障内操作这种底层存储。这就是-primitiveValueForKey:-setPrimitiveValue:forKey:的用武之地。

这就是为什么在@property@dynamic出现之前,实现核心数据getter和setter的标准模式是这样的:

代码语言:javascript
复制
// 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

当然,现在,如果您希望核心数据在运行时为您生成以下内容,您可以只声明一个属性并将其定义为@dynamic

代码语言:javascript
复制
// 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也提供了一种新的方法来实现这一点,也是围绕属性声明和自动合成构建的:

代码语言:javascript
复制
// 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

请注意,我将类continuation放在了.m文件中;Person外部的代码(甚至-awakeFromInsert-awakeFromFetch外部的代码)都不应该接触到它。但它确实让我获得了"name“属性的底层存储,而不是在我的代码中嵌入文字字符串,而是使用了真正的类型。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4147020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档