接下来我的问题是:
例如,我有对象A(这是数据模型对象)。假设对象A具有某些属性(例如请求属性)。我也有对象B(这是我的视图对象)。
所以我的问题是下一个:当我的数据模型将被更改(请求属性的值已更改)时,我想在我的视图中了解此事件(对象B)
如何在对象之间创建此交互。
例如,在request中写入“some_value”,在此对象B之后立即知道它。
感谢您的回复!
答案 0 :(得分:2)
您可以使用委托模式,NSNotifications,回调块甚至KVO。选择取决于情况,在你的情况下委托或回调块可以工作。
答案 1 :(得分:1)
如果你只想让对象B知道什么,我会建议使用委托。 如果以后你想要对象C,D和E也知道对象A中发生了什么,我建议使用NSNotification。
答案 2 :(得分:1)
我会使用Key Value Observing。您的视图控制器(不是视图本身)会将自己设置为数据模型对象的观察者,当它获得观察者通知时,它将更新视图。
[myDataObject addObserver: myViewController
forKeyPath: @"request"
options: NSKeyValueObservingOptionNew
context: nil];
// in the view controller you need
-(void) observeValueForKeyPath: (NSString*) path
ofObject: (id) aDataObject
change: (NSDictionary*) changeDictionary
context: (void*) context]
{
if (aDataObject == myDataObject
&& [path isEqualToString: @"request"])
{
// change you are interested in
}
// Call suoer implementation of this method if it implements it
}
完成后不要忘记删除观察者。
另外,在线程环境中要小心。在发生更改的同一线程上通知观察。如果这不是主线程,则需要使用-performSelectorOnMainThread:withObject:waitUntilDone:
对UI进行任何更改。
答案 3 :(得分:0)
例如,我有类DataModel。在这一步中,我为我的属性 str 添加观察者。对于对象,我将发送我的视图控制器。
<强>·H 强>
#import <Foundation/Foundation.h>
@interface DataModel : NSObject
@property (strong, nonatomic) NSString *str;
- (void)setUpObserver:(id)object;
@end
<强>的.m 强>
#import "DataModel.h"
@implementation DataModel
@synthesize str;
- (void)setUpObserver:(id)object
{
[self addObserver:object forKeyPath: @"str" options: NSKeyValueObservingOptionNew context: nil];
}
@end
在我的视图控制器中
#import "DataModel.h"
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
dm = [[DataModel alloc] init];
[dm setUpObserver:self];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if (object == dm && [keyPath isEqualToString: @"str"])
{
NSLog(@"it's work");
}
}
- (IBAction)changeValue:(id)sender {
dm.str = @"test change value";
}
@end
这是我对KVO的认识。谢谢JeremyP的解释。