#import <Foundation/Foundation.h>
typedef id (^BinderTransformationBlock) (id value);
@interface KVOBinder : NSObject
/*
*把toObject的toKeyPath的值 和 fromObject的fromKeyPath的值 绑定。fromKeyPath变动toObject也跟着变动
*valueTransformer:自定义的数据类型转换
*
*/
+ (id)binderFromObject:(id)fromObject keyPath:(NSString *)fromKeyPath
toObject:(id)toObject keyPath:(NSString *)toKeyPath
valueTransformer:(NSValueTransformer *)valueTransformer;
/*
*结束绑定
*/
- (void)stopBinding;
@end
#import "KVOBinder.h"
#import "KVOObserver.h"
@interface KVOBinder ()
{
KVOObserver *_observer;
}
@end
@implementation KVOBinder
+ (id)binderFromObject:(id)fromObject keyPath:(NSString *)fromKeyPath
toObject:(id)toObject keyPath:(NSString *)toKeyPath
valueTransformer:(NSValueTransformer *)valueTransformer
{
BinderTransformationBlock block = nil;
if (valueTransformer) {
block = ^id(id value) {return [valueTransformer transformedValue:value];} ;
}
return [[self alloc]initForBindingFromObject:fromObject keyPath:fromKeyPath toObject:toObject keyPath:toKeyPath transformationBlock: block];
}
- (id)initForBindingFromObject:(id)fromObject keyPath:(NSString *)fromKeyPath
toObject:(id)toObject keyPath:(NSString *)toKeyPath
transformationBlock:(BinderTransformationBlock)transformationBlock
{
if((self = [super init])) {
__weak id wToObject = toObject;
ObserverBlock changeBlock;
if(transformationBlock) {
changeBlock = [^(NSDictionary *change) {
[wToObject setValue:transformationBlock(change[NSKeyValueChangeNewKey])
forKeyPath:toKeyPath];
} copy];
} else {
changeBlock = [^(NSDictionary *change) {
[wToObject setValue:change[NSKeyValueChangeNewKey]
forKeyPath:toKeyPath];
} copy];
}
_observer = [KVOObserver observerForObject:fromObject
keyPath:fromKeyPath
options:NSKeyValueObservingOptionNew
changeBlock:changeBlock];
}
return self;
}
- (void)stopBinding
{
[_observer stopObserving];
_observer = nil;
}
@end
应用:
@interface Author : NSObject
@property (nonatomic,copy)NSString *toKey;
@end
@implementation Author
@end
@interface Person : NSObject
@property (nonatomic,copy)NSString *fromKey;
@end
@implementation Person
@end
#import "KVOBinder.h"
@interface AppDelegate ()
{
Person *fromObject ;
Author *toObject ;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
fromObject = [[Person alloc]init];
toObject = [[Author alloc]init];
KVOBinder *binder3 = [KVOBinder binderFromObject:fromObject keyPath:@"fromKey"
toObject:toObject keyPath:@"toKey"
valueTransformer:nil];
[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(fromObjectChange) userInfo:nil repeats:YES];
...
return YES;
}
static int line = 0;
-(void)fromObjectChange
{
line++;
fromObject.fromKey = [NSString stringWithFormat:@"line %d",line];
NSLog(@"toObject.toKey -- %@",toObject.toKey);
}
结果:
2014-01-22 17:59:27.403 Production[3512:317534] toObject.toKey -- line 1
2014-01-22 17:59:29.722 Production[3512:317534] toObject.toKey -- line 2
2014-01-22 17:59:32.722 Production[3512:317534] toObject.toKey -- line 3
......