【问题标题】:Overriding setters with arc and dynamic properties使用弧和动态属性覆盖设置器
【发布时间】:2012-01-22 15:59:43
【问题描述】:

我需要在 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
}

现在,我在问自己如何做到这一点?

【问题讨论】:

    标签: ios core-data ios5 overriding setter


    【解决方案1】:

    我的问题的解决方案:

    @interface Transaction : NSManagedObject 
    @property (nonatomic, retain) NSDate * date;
    @end
    
    @implementation Transaction
    @dynamic date;
    
    -(void)setDate:(NSDate *)date
    {
        [self setPrimitiveValue:date forKey:@"date"];
        //additional stuff omitted
    }
    

    【讨论】:

    • 调用 willChangeValueForKey 之前和 didChangeValueForKey 之后保持 KVO。
    【解决方案2】:

    “日期”是否由 Core Data 中的相应属性支持?

    如果有,请看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
    }
    

    【讨论】:

      【解决方案3】:

      这是在您的 .m 中覆盖 NSManagedObject 属性而不破坏 KVO 的 Apple 方式:

      @interface Transaction (DynamicAccessors)
      - (void)managedObjectOriginal_setDate:(NSDate *)date;
      @end
      
      @implementation Transaction
      @dynamic date;
      
      - (void)setDate:(NSDate *)date
      {
          [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

      【讨论】:

        猜你喜欢
        • 2011-12-17
        • 1970-01-01
        • 2014-03-11
        • 2019-07-28
        • 2019-03-22
        • 1970-01-01
        • 2017-08-29
        • 2015-11-01
        • 1970-01-01
        相关资源
        最近更新 更多