Ios KVO还是自定义访问器方法?

Ios KVO还是自定义访问器方法?,ios,core-data,key-value-observing,Ios,Core Data,Key Value Observing,对于iOS应用程序,我几乎没有通过关系链接的实体。举个简单的例子,假设我们得到了这样的关系(一对多): 及 现在,假设我想设置布尔值(在核心数据中实现为NSNumber)属性在每次出现以下情况时都更改为TRUE: 公司实体的一个属性被更改,当然除了has_更改了属性本身(因为这会导致循环) person实体的属性已更改 实现这样的东西最好的(易于实现+快速处理)方式是什么?我发现有两种选择: 然而,由于objective-C2.0、core data/cocoa或iOS的变化,我发现

对于iOS应用程序,我几乎没有通过关系链接的实体。举个简单的例子,假设我们得到了这样的关系(一对多):

现在,假设我想设置布尔值(在核心数据中实现为NSNumber)属性在每次出现以下情况时都更改为
TRUE

  • 公司实体的一个属性被更改,当然除了has_更改了属性本身(因为这会导致循环)
  • person实体的属性已更改
实现这样的东西最好的(易于实现+快速处理)方式是什么?我发现有两种选择:

然而,由于objective-C2.0、core data/cocoa或iOS的变化,我发现与此主题相关的所有内容似乎都过时了。例如,在启用ARC的情况下使用xcode 4.6似乎不起作用,因为我粘贴的所有内容都是核心数据生成的@dynamic行(请参见上面的代码示例)


此外,我发现文档中的内容有点混乱实现这一点的最佳方式是什么?KVO?自定义访问器?两者兼而有之,还是完全不同?对于给定的示例,可能的实现是什么样子的?

您可以这样做:

@implementation Company
// ...

- (void) didChangeValueForKey: (NSString *) key
{ 
   [super didChangeValueForKey: key];
   if (! [key isEqualToString: @"has_changed"])
     self.has_changed = YES;
}

// ...
@end
通过
公司
属性,对
人员
也有类似的情况。您还需要实现
didChangeValueForKey:withSetMutation:usingObjects:


请注意,此建议并未解决让控制器了解变更的常见需求。还有其他方法可以做到这一点。

您可以这样做:

@implementation Company
// ...

- (void) didChangeValueForKey: (NSString *) key
{ 
   [super didChangeValueForKey: key];
   if (! [key isEqualToString: @"has_changed"])
     self.has_changed = YES;
}

// ...
@end
通过
公司
属性,对
人员
也有类似的情况。您还需要实现
didChangeValueForKey:withSetMutation:usingObjects:


请注意,此建议并未解决让控制器了解变更的常见需求。还有其他方法可以做到这一点。

您发现了什么表明KVO已经过时了?一般来说不是KVO,而是在实体类中使用时的特殊情况。我的意思是,我不确定什么是“正确”的方法,以及将KVO实现放在何处:在实体中?在服务/控制器类中?或者更好地在实体中使用自定义访问器方法?子实体如何:我应该使用观察者在那里寻找父实体,还是应该编写自定义访问器并在其中操纵父实体已更改的属性?好问题,但重复:@Inafziger您链接的示例不使用弧或核心数据。我同意这可能是关于KVO的一个很好的一般性答案,但我的问题不是关于KVO,而是关于对于给定的示例,KVO或自定义核心数据访问器方法或两者的组合是否是可行的方法。您发现了什么表明KVO过时了?一般来说不是KVO,而是在实体类中使用时的特殊情况。我的意思是,我不确定什么是“正确”的方法,以及将KVO实现放在何处:在实体中?在服务/控制器类中?或者更好地在实体中使用自定义访问器方法?子实体如何:我应该使用观察者在那里寻找父实体,还是应该编写自定义访问器并在其中操纵父实体已更改的属性?好问题,但重复:@Inafziger您链接的示例不使用弧或核心数据。我同意这可能是关于KVO的一个很好的一般性答案,但我的问题不是关于KVO,而是关于对于给定的示例,KVO或自定义核心数据访问器方法或两者的组合是否是可行的方法。这是否会以某种方式“禁用”自动设置器/获取器或由核心数据创建的任何其他方法?当我创建一个自定义
didChangeValueForKey
方法时,是否还有其他需要注意的事情?编辑以添加到“super”调用中。嗯,好的,现在看起来不错。但是我不明白你的意思:核心数据是如何处理控制器通知的,或者它是如何处理控制器通知的(如果按照上面给定的示例自动生成的话)?请参见
NSFetchedResultsControllerDelegate
(如果你使用的是
NSFetchedResultsController
)或者NSManagedObjectContext上的通知方法。另外,请注意,NSManagedObject上已经有一个hasChanges布尔值,但它的含义与您所问的略有不同。目前我使用的不是NSFetchedResultsController,而是NSManagedObjectContext。我知道,如果我想更新我的视图,我必须实现某种通知。现在,这个问题的相关部分是:如果我覆盖了didChangeValueForKey方法,我是否需要做一些与不覆盖该方法不同的事情来实现通知?我猜快速的答案是“否”?这是否会以某种方式“禁用”自动设置器/获取器或由核心数据创建的任何其他东西?当我创建一个自定义
didChangeValueForKey
方法时,是否还有其他需要注意的事情?编辑以添加到“super”调用中。嗯,好的,现在看起来不错。但是我不明白你的意思:核心数据是如何处理控制器通知的,或者它是如何处理控制器通知的(如果按照上面给定的示例自动生成的话)?请参见
NSFetchedResultsControllerDelegate
(如果你使用的是
NSFetchedResultsController
)或者NSManagedObjectContext上的通知方法。另外,请注意,NSManagedObject上已经有一个hasChanges布尔值,但它的含义与您所问的略有不同。目前我使用的不是NSFetchedResultsController,而是NSManagedObjectContext。我知道,如果我想更新我的视图,我必须实现某种通知。这个问题的相关部分是:如果我
//Person.h
@class Company;

@interface Person : NSManagedObject
@property (nonatomic, retain) NSString * first_name;
@property (nonatomic, retain) NSString * last_name;
@property (nonatomic, retain) Company *company;
@end

//Person.m
#import "Person.h"
#import "Company.h"

@implementation Person
@dynamic first_name;
@dynamic last_name;
@dynamic company;
@end
@implementation Company
// ...

- (void) didChangeValueForKey: (NSString *) key
{ 
   [super didChangeValueForKey: key];
   if (! [key isEqualToString: @"has_changed"])
     self.has_changed = YES;
}

// ...
@end