iOS kvo 結合 FBKVOController 的使用
一:FBKVOControlloer是FaceBook開源的一個 在 iOS,maxOS上使用 kvo的 開源庫;
提供了block和@selector(SEL) 的回調操作,很方便實用;
https://github.com/facebook/KVOController
二:示例:
fbKVO = [FBKVOController controllerWithObserver:self];
[fbKVO observe:personOne keyPath:@"pName" options:NSKeyValueObservingOptionNew block:^(id observer, id object, NSDictionary *change) {
//NSLog(@"%@ %@ %@",observer,object,change);
//Person *p = (Person *)object;
//self.title = p.pName;
self.title = change[NSKeyValueChangeNewKey];
}];
三:流程操作
1:創建 Person Object
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic,strong)NSString *pName; @end
2: 下載FBKVOController---導入FBKVOController.h .m文件 ARC環境
#import "FBKVOController.h" #import "Person.h"
3:創建Person對象(被觀察者),及FBKVOController對象(管理觀察者與被觀察者);
@interface RootViewController ()
{
Person *personOne;
FBKVOController *fbKVO;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"TEST";
listArray = [[NSMutableArray alloc]initWithCapacity:5];
[listArray addObject:@"FBKVOController"];
personOne = [[Person alloc]init];
personOne.pName = @"defaultName";
fbKVO = [FBKVOController controllerWithObserver:self];
[fbKVO observe:personOne keyPath:@"pName" options:NSKeyValueObservingOptionNew block:^(id observer, id object, NSDictionary *change) {
//NSLog(@"%@ %@ %@",observer,object,change);
//Person *p = (Person *)object;
//self.title = p.pName;
self.title = change[NSKeyValueChangeNewKey];
}];
/**
一:kvo值檢測類型;
1: NSKeyValueObservingOptionNew 傳遞變化之后的值;
2: NSKeyValueObservingOptionOld 傳遞變化之前的值;
3: NSKeyValueObservingOptionInitial 觀察者會在程序初始時,也就是觀察變化之前,優化執行一次 觀察動作;即上述執行上面 block操作一次;並且傳遞 默認的值,和以后傳遞 變化后的值;
4: NSKeyValueObservingOptionPrior 會調用兩次觀察者操作,值改變之前,值改變之后;
二:獲取 kvo的值;
change[NSKeyValueChangeNewKey] 新值;
change[NSKeyValueChangeOldKey] 舊值;
*/
}
4:添加改變 被觀察者 Person的pName屬性值變化操作,然后在 觀察者觀察到 pName值發生變化時,改變 self.title的值
#pragma mark action 點擊
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
int nums = arc4random()%10;
personOne.pName = [NSString stringWithFormat:@"newName%d",nums];
NSLog(@"new --> %@",personOne.pName);
}
//在 pName屬性值發生變化時,改變self.title的值;
[fbKVO observe:personOne keyPath:@"pName" options:NSKeyValueObservingOptionNew block:^(id observer, id object, NSDictionary *change) {
//NSLog(@"%@ %@ %@",observer,object,change);
//Person *p = (Person *)object;
//self.title = p.pName;
self.title = change[NSKeyValueChangeNewKey];
}];
5:如果想移除觀察者:
//三種方式任你選擇;
[fbKVO unobserve:personOne];
[fbKVO unobserve:personOne keyPath:@"pName"];
[fbKVO unobserveAll];
6: 效果:
改變值之前

改變值之后

