在objective-c中与对象交互的最佳实践是什么?

时间:2012-02-08 13:57:43

标签: objective-c

接下来我的问题是:

例如,我有对象A(这是数据模型对象)。假设对象A具有某些属性(例如请求属性)。我也有对象B(这是我的视图对象)。

所以我的问题是下一个:当我的数据模型将被更改(请求属性的值已更改)时,我想在我的视图中了解此事件(对象B)

如何在对象之间创建此交互。

例如,在request中写入“some_value”,在此对象B之后立即知道它。

感谢您的回复!

4 个答案:

答案 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的解释。