我需要为NSManagedObject子类中的字段(我们称之为foo)编写一个自定义setter方法.数据模型中定义了foo,Xcode在数据模型中自动生成了@property@dynamic个字段.h和.m个文件.

如果我这样写我的setter:

- (void)setFoo: (NSObject *)inFoo {
    [super setFoo: inFoo];
    [self updateStuff];
}

然后我在调用super时收到编译器警告.

或者,如果我这样做:

- (void)setFoo: (NSObject *)inFoo {
    [super setValue: inFoo forKey: inFoo];
    [self updateStuff];
}

然后我就进入了一个无限循环.

那么,为NSManagedObject的子类编写自定义setter的正确方法是什么呢?

推荐答案

以下是Apple在你的应用程序中覆盖NSManagedObject个属性(而不 destruct KVO)的方法.m文件:

@interface Transaction (DynamicAccessors)
- (void)managedObjectOriginal_setDate:(NSDate *)date;
@end

@implementation Transaction
@dynamic date;

- (void)setDate:(NSDate *)date
{
    // invoke the dynamic implementation of setDate (calls the willChange/didChange for you)
    [self managedObjectOriginal_setDate:(NSString *)date;

    // your custom code
}

managedObjectOriginal_propertyName是一个内置的magic方法,你只需要添加它的定义.如第What's New in Core Data in macOS 10.12, iOS 10.0, tvOS 10.0, and watchOS 3.0页底部所示

Objective-c相关问答推荐

MKMapView zoom 到 viewDidLoad 上的用户位置?

ios10:viewDidLoad 框架宽度/高度未正确初始化

Xcode 是否支持区域?

performSelector 的返回值:

如何使用 Cocoa 创建临时文件?

仅替换 NSString 中子字符串的第一个实例

块引用作为Objective-C中的实例变量

如何在 iOS 中拨打电话?

如何在表格视图中的两个单元格之间留出空间?

UICollectionView 单元格 Select 和单元格重用

如何在 Objective-C 中创建一个空白的透明 png?

将块存储在数组中

在 32 位和 64 位架构上格式化 NS(U)Integer 时类型转换的替代方法?

Xcode 7 UI 测试:如何在代码中消除一系列系统alert

遍历 NSString 中所有字符的最有效方法

IOS 6强制设备方向为横向

iOS ScrollView 需要约束 y 位置或高度

如何创建 .dSYM 文件?

在objective c中以自定义格式获取当前时间

@synthesized 保留属性的释放是如何处理的?