0

我有一组通过数组控制器(所有绑定)显示在 Tableview 中的属性,我编写了一些代码来根据其他属性的内容更改其中一个属性。我在 Core data 为这个实体创建的 .m 文件中写了这个:

标题:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Instrument;

@interface IO : NSManagedObject

@property (nonatomic, retain) NSNumber * channel;
@property (nonatomic, retain) NSString * depiction;
@property (nonatomic, retain) NSString * prefix;
@property (nonatomic, retain) NSNumber * rack;
@property (nonatomic, retain) NSNumber * slot;
@property (nonatomic, retain) NSString * suffix;
@property (nonatomic, retain) NSString * tag;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * depictionFull;
@property (nonatomic, retain) Instrument *io_instrument;

@end

主要的:

#import "IO.h"
#import "Instrument.h"
#import "Loop.h"
#import "Area.h"


@implementation IO {
}

@dynamic channel;
@dynamic depiction;
@dynamic prefix;
@dynamic rack;
@dynamic slot;
@dynamic suffix;
@dynamic tag;
@dynamic type;
@dynamic depictionFull;
@dynamic io_instrument;

- (void)awakeFromFetch{

    [self setDepictionFull:[NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction]];
}

@end

这里有两个问题:

  1. 这只会更改我的属性的表“视图”值,但不会更改实际保存的值(我知道这一点,因为当我注释掉代码时,值不会被保存)

  2. 我使用的“awakeFromFetch”函数仅在获取数据时应用代码,但我也希望在更改实体(或数组控制器)中的任何属性时刷新它。

4

1 回答 1

0

最好的方法不是保存一个值depictionFull,而是在请求时返回它。

- (NSString *)dipictionFull {
    return [NSString stringWithFormat:@"%@ %@ %@ %@", self.io_instrument.instrument_loop.loop_area.name, self.io_instrument.instrument_loop.depiction, self.io_instrument.depiction, self.depiction];
}

这样,无论如何,它将始终返回最新的值!它以一种懒惰的方式运行,iOS 和 Objective-c 往往可以很好地使用它。当属性或属性完全依赖于其他属性或属性时,这[通常]不是一个坏主意。

就不保存而言:我猜该值显示正确并且没有被保存,因为您没有明确保存它。

最后,您不应该将此代码放入实际的 NSManagedObject 子类中。如果你添加一个属性并且需要重新创建这个类怎么办?然后(如果您使用 XCodes 创建工具)它将完全清除您的自定义awakeFromFetch. 而是创建一个categoryforIO并将您的自定义代码放在那里。然后,如果您需要重新创建您的NSManagedObject实现,您的类别将保持不变。

更新 - 如何使用类别

要创建类别,请转到文件->新建->文件(或 command+N),然后在Cocoa Touch下选择Objective-C 类别。将您的类别命名为AddOn(或类似名称)并在Category下放置您的 NSManagedObject 的子类(在本例中Instrument)。创建完成后,将方法-(NSString *)dipictionFull;放入 中,.h并将上述实现放入.m. 然后当你想Instrument+AddOn.h在需要的类中使用这个方法导入dipictionFull。然后只需调用它[self.myInstrument dipictionFull],您就会得到始终是最新的字符串,因为它每次都在实时提取值。

于 2013-06-21T13:07:21.920 回答