2013-05-21 77 views
0

我有一個這樣的協議:使用清潔委託模式

#import <Foundation/Foundation.h> 

@protocol StoreDisplayerDelegate <NSObject> 

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

@end 

和我有符合先例協議StoreDisplayerDelegate

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

@implementation ShelfVC 
... 

- (void)viewDidLoad { 

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

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

@end 

而且在我的代碼callass(在同一個班)有時候我會打電話給代表們做某些事情,例如:

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

我的任務離子 1. is:當object是另一個對象的委託時,委託所實現的方法是否只由另一個對象調用(女巫有它的參考)?我的意思是這一點,例如,在代碼中,我已經表明應梅索德changeActionForObjectWithId:只需下載管理器調用或者我可以用它在我的課像這樣的立式珠磨機:

  1. 是我在做什麼清洗或使用Delegate模式的糟糕設計?

我希望它很清楚。

回答

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」(例如,在重構後你不再需要這個委託),代碼將繼續工作。

0

委託是允許對象執行某些操作的協議。

在您的例子:

@interface ShelfVC : UIViewController : <StoreDisplayerDelegate> 

這告訴UIViewController的是要落實在StoreDisplayerDelegate協議的一些方法的編譯器。適用於StoreDisplayerDelegate的對象的行爲方式取決於委託方法中的協議。

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)以外的其他任何方法調用它們。

+0

感謝您的回答。但我已經看到在其他peopole代碼中,y調用例如 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath數據源方法,我認爲它與我的情況是一樣的,沒有? – samir

+0

屬於「向代表詢問一些信息」的類別。你會注意到它通過'UITableView *'。你沒有通過'StoreDisplayer *'。你可能會想「但我不需要指向StoreDisplayer的指針」。但是你沒有遵循這個模式。你的問題是關於良好的設計和遵循委託模式。 –

+0

感謝您的回答,您對@ marco的回答有什麼想法?我很抱歉,我不知道女巫的回答是否正確,並接受它:) – samir