2011-12-17 61 views
3

我需要在setter方法中做一些額外的東西。但我這樣做的時候所以得到一個無限循環:用弧和動態屬性覆蓋setter

我有一個核心的數據對象

@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date; 
@end 

@implementation Transaction 
@dynamic date; 

-(void)setDate:(NSDate *)date 
{ 
    self.date = date; 
    //additional stuff omitted 
} 

所以,在這種情況下,我得到一個無限循環。好了,所以我在網上搜索,並以下列方式修改我的代碼,併爲每一個版本,我得到編譯器錯誤

版本1:

@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date; 
@end 

@implementation Transaction 
@dynamic date; 

-(void)setDate:(NSDate *)date 
{ 
    self->date = date; //Error: Property 'date' found on object 'Transaction *'; did you mean to access it with the "." operator? 
    //additional stuff omitted 
} 

版本2:

@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date; 
@end 

@implementation Transaction 
@dynamic date = _date; //Error: Expected ';' after @dynamic 

-(void)setDate:(NSDate *)date 
{ 
    _date = date; 
    //additional stuff omitted 
} 

現在,我我在問自己該怎麼做?

回答

5

的解決方案,我問題:

​​
+2

它打破志願... – AlexeyVMP 2013-07-30 05:43:15

+2

呼叫willChangeValueForKey之前和之後didChangeValueForKey保持KVO的底部看到。 – brodney 2014-01-28 14:54:11

2

「日期」是否由核心數據中的相應屬性支持?

如果是的話,請看看Custom setter methods in Core-Data

如果沒有,你不需要堅持「日期」,你的代碼應該是以下幾點:

@interface Transaction : NSManagedObject 
@property (nonatomic, retain) NSDate * date; 
@end 

@implementation Transaction 
@synthesize date = _date; 

-(void)setDate:(NSDate *)date 
{ 
    _date = date; 
    //additional stuff omitted 
} 
0

下面是壓倒一切的NSManagedObject性質沒有打破國際志願者組織,在您的m的新方法:

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

@implementation Transaction 
@dynamic date; 

- (void)setDate:(NSDate *)date 
{ 
    // invoke the dynamic implementation of setDate 
    [self managedObjectOriginal_setDate:(NSString *)date; 
    // your custom code 
} 

截至本頁面What's New in Core Data in macOS 10.12, iOS 10.0, tvOS 10.0, and watchOS 3.0