使用清洁委托模式

时间:2013-05-21 14:31:56

标签: ios objective-c

我有这样的协议:

#import <Foundation/Foundation.h>

@protocol StoreDisplayerDelegate <NSObject>

-(void) changeActionForObjectWithId:(NSString *)objectID ;

@end

我有一个符合先前协议StoreDisplayerDelegate

的callass
@interface ShelfVC : UIViewController :<StoreDisplayerDelegate>
....

@implementation ShelfVC 
...

- (void)viewDidLoad {

   ...
   DownloadManager *manager = [DownloadManager sharedInstance];
   [manager setStoreDisplayerDelegate:self];
   ....
}

#pragma mark StoreDisplayerDelegate methods
-(void) changeActionForObjectWithId:(NSString *)objectID {
   ......
}

@end

在我的代码中(在同一个类中)有时我会调用委托方法来执行某些操作,例如:

- (void)anOtherMethod{
   [self changeActionForObjectWithId:nil];
}

我的问题 1. is:当object是另一个对象的委托时,委托实现的方法是否只由另一个对象调用(对它有引用)?我的意思是,例如在我已经显示的代码中,应该由downLoad管理器调用的方法changeActionForObjectWithId:,或者我可以在我的类的内容中使用它,如下所示:

  1. 是我正在使用委托模式进行清理还是糟糕的设计?
  2. 我希望很清楚。

4 个答案:

答案 0 :(得分:1)

您的委托方法名称听起来就像一个命令。

-(void)changeActionForObjectWithId:(NSString *)objectID;

听起来你的StoreDisplayer告诉代表做某事。您也很想从ViewController中调用该方法,这一事实证实了这一点。

这不是委托模式。委托模式用于类以通知委托变更,或向代表询问某些信息。委托类(StoreDisplayer?)不应该知道任何特定委托的作用,因此它不应该能够直接给出特定的命令。只委托通用行为。

委托方法看起来更像这些例子:

-(BOOL)actionShouldChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer;
-(void)actionWillChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer objectId:(NSString *)objectId;
-(void)actionDidChangeForStoreDisplayer:(StoreDisplayer*)storeDisplayer objectId:(NSString *)objectId;

我不是说那些是你需要的,但他们应该给你这个想法。

当你的委托方法看起来像这样时,显然你不会想要从正在进行委托的类(StoreDisplayer)以外的任何东西中调用它们。

答案 1 :(得分:0)

在我的项目中,我有不同目的的相同情况。在我看来,委托方法必须只由另一个对象调用,因为它是它的方法。

如果您需要在委托方法中执行某些操作,最好创建另一个私有方法来执行操作并从委托方法中调用它。

一些例子。而不是这样做:

- (void)anOtherMethod {
   [self changeActionForObjectWithId:nil];
}

- (void)changeActionForObjectWithId:(NSString *)objectID {
   < some actions >
} 

我这样做:

- (void)privateMethod{
   < some actions >
}

- (void)anOtherMethod {
   [self privateMethod];
}

- (void)changeActionForObjectWithId:(NSString *)objectID {
   [self privateMethod];
} 

为什么这样?因为您必须考虑委托方法到基础对象的“扩展”:如果删除“changeActionForObjectWithId”(例如,在重构后您不再需要委托)代码将继续工作

答案 2 :(得分:0)

委托是一种允许对象执行某些操作的协议。

在你的例子中:

@interface ShelfVC : UIViewController : <StoreDisplayerDelegate>

这告诉编译器UIViewController将在StoreDisplayerDelegate协议中实现一些方法。适用于StoreDisplayerDelegate的对象如何运行将取决于委托方法中的协议。

答案 3 :(得分:0)

你对代表和协议有点困惑。委托是一种使用协议的设计模式。 协议仅定义预期由另一个(非特定)类实现的方法和属性。从哪里访问此方法/属性无关紧要。