gpt4 book ai didi

ios - KVO 或自定义访问器方法?

转载 作者:行者123 更新时间:2023-11-29 13:07:12 25 4
gpt4 key购买 nike

我得到的 iOS 应用 实体很少,它们由关系链接。举一个简单的例子,假设我们有这样的关系(一对多):

company <--->> person

我正在使用 xcode 4.6 和用于模型生成的核心数据建模工具,所以我最终得到了

//Company.h
@class Person;
@interface Company : NSManagedObject
@property (nonatomic, retain) NSString * company_name;
@property (nonatomic, retain) NSNumber *has_changed;
@property (nonatomic, retain) NSSet *person;
@end

@interface Company (CoreDataGeneratedAccessors)
- (void)addPersonObject:(Person *)value;
- (void)removePersonObject:(Person *)value;
- (void)addPerson:(NSSet *)values;
- (void)removePerson:(NSSet *)values;
@end

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

@implementation Company
@dynamic company_name;
@dynamic has_changed;
@dynamic person;
@end

//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

现在,假设我想在每次发生以下情况之一时将 bool 值(在 Core Data 中作为 NSNumber 实现)属性 has_changed 设置为 TRUE:

  • 公司实体的属性已更改,当然 has_changed 属性本身除外(因为这会导致循环)
  • 人员实体的属性已更改

什么是最好的(易于实现 + 快速处理)方式来实现这样的事情?对于我能够发现的,有两种选择:

但是,由于 objective-c 2.0、core-data/cocoa 或 iOS 的变化,我发现与该主题相关的所有内容似乎都已过时。例如,automatically generating the accessor methods by using the core-data modelling editor在启用 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

Person 类似,通过 company 属性。您还想实现 didChangeValueForKey:withSetMutation:usingObjects:

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

关于ios - KVO 或自定义访问器方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com