2015-06-15 38 views
0

我写了一个演示想尝试KVO编程,我发现observeValueForKeyPath 方法总是执行两次,当我只改变值一次,有什么错?请帮助我,谢谢志愿observeValueForKeyPath方法两次

代码

StatusSyncer.h

#import <Foundation/Foundation.h> 

@interface StatusSyncer : NSObject 
@property NSString *title; 
+(instancetype)sharedInstance; 
@end 

StatusSyncer.m

#import "StatusSyncer.h" 
@implementation StatusSyncer 
+ (instancetype)sharedInstance { 
    static id _sharedInstance = nil; 
    static dispatch_once_t oncePredicate; 
    dispatch_once(&oncePredicate, ^{ 
     _sharedInstance = [[self alloc] init]; 
    }); 
    return _sharedInstance; 
} 
@end 

ViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self.statusSyncer addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil]; 

} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 
    if ([keyPath isEqualToString:@"title"]) { 
     NSLog(@"chane"); 
    } 
} 

-(StatusSyncer *)statusSyncer{ 
    if (_statusSyncer==nil) { 
     _statusSyncer = [StatusSyncer sharedInstance]; 
    } 

    return _statusSyncer; 
} 

DetailViewController.m

- (IBAction)changeAction:(id)sender { 
    self.statusSyncer.title= @"newTitle叶"; 

} 

-(StatusSyncer *)statusSyncer{ 
    if (_statusSyncer==nil) { 
     _statusSyncer = [StatusSyncer sharedInstance]; 
    } 

    return _statusSyncer; 
} 

输出:

2015-06-15 12:58:49.849 KVOAdvence[2433:74541] chane 
2015-06-15 12:58:49.850 KVOAdvence[2433:74541] chane 

回答

1

我觉得方法addObserver:执行两次。

您将检查其他控制器继承,也可以扩展的ViewController

+0

WA,良好的分析,我知道为什么 – james

1

哦,我做一个愚蠢的错误 DetailViewController超类是视图控制器,这使得StatusSyncer添加 两次观察员