2012-01-28 112 views
10

,我才真正開始iOS開發,但必須通過C#ASP.net幾年的開發。說實話,我從來沒有真正需要理解代表/事件等,我知道我在編寫web.forms時使用它們,但很多功能都由框架來處理,在幕後。代表在IOS - 一些澄清要求

所以,現在我在IOS正在開發我不得不試着去理解它們如何運作(我假設這裏的代表/事件的原理是一樣的跨語言,也許我錯了)。不管怎樣,代碼在IOS下面一行:

if ([self.delegate respondsToSelector:@selector(startImporting:)]) 
{ 
      [self.delegate startImporting:self]; 
} 

我是正確的思維,在僞代碼,它指的是沿着線的東西:

如果方法/類調用此方法具有方法稱爲'startImporting',然後在調用類中調用方法'startImporting'。

希望這是明確的。如果是這樣的話,那麼將它本質上是一樣的有C#中的靜態方法,你可以用類似呼籲:

myImportClass.startImporting(); 

想必沒有,或者說是它是如何完成的。那麼,我是否錯過了代表的全部觀點,他們的好處等?我已經閱讀了他們一遍又一遍,雖然它是有道理的,它從來沒有點擊過,我從來沒有(反正在網絡形式)真的看到了使用它們的好處。

隨着我在.net中使用lambda表達式並且它們與C#中的委託人緊密聯繫,這樣就變得越來越重要,所以雖然我可以開始使用它們,但我更願意知道爲什麼以及代表有什麼優點實際上是。

+0

這裏http://stackoverflow.com/questions/30662032/ios-callback-function -from-library你可以找到代表的實現細節。 – 2015-12-17 06:43:46

回答

45

在可可的委託模式用來通知(報告進展情況等)或查詢(要求提供憑證等)另一個對象,而不瞭解它。

通常,您使用協議來定義您將在委​​託上調用哪些方法,然後委託需要遵守該協議。您還可以添加代理不需要實現的方法(可選)。當你這樣做時,你必須調用-respondsToSelector :,因爲你不知道委託是否想要調用特定的方法。

一個例子:
您有製造物品類,姑且稱之爲Machine和類Worker的工人。該機器需要調整的任務:

Machine *machine = [[Machine alloc] init]; 
[machine prepareWithParameters:myParameters]; 

現在我們有了機器,我們要生產的Stuff巨量:

[machine produceStuff]; 

好了,我們就大功告成了。但是,我們如何知道何時生產了一個Stuff單位?我們可以有我們的工人不斷地站在我們旁邊的機器,並等待:

while (![machine isFinished]) { 
    if ([machine didProduceStuff]) { 
     Stuff *stuff = [machine producedStuff]; 
     [self doSomethingWithStuff:stuff]; 
    } 
    else { 
     // Get a very large coffee... 
    } 
} 

那豈不是巨大的,如果機器沒有自動通知我們,當它與生產的Stuff一個單位做了什麼?

@protocol MachineDelegate <NSObject> 
@optional 
    - (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff; 
@end 

讓我們增加了worker作爲machine委託:

Worker *worker; 
Machine *machine = [[Machine alloc] init]; 
[machine prepareWithParameters:myParameters]; 
[machine setDelegate:worker]; // worker does conform to <MachineDelegate> 

[machine produceStuff]; 

Machine完成生產的東西,它會接着撥打:

if ([[self delegate] respondsToSelector:@selector(machine:didProduceStuff:)]) 
    [[self delegate] machine:self didProduceStuff:stuff]; 

worker然後將收到這個方法並可以做些事情:

- (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff { 
    [self doSomethingWithStuff:stuff]; 
    if ([machine isFinished]) 
     [self shutDownMachine:machine]; 

}

對於員工來說效率和效率都不是那麼高嗎?現在他可以在機器還在生產的時候做比機器更高的生產效率。現在,您可以更加方法添加到MachineDelegate

@protocol MachineDelegate <NSObject> 
@required 
    - (void) machineNeedsMaintenance:(Machine *)machine; 
    - (void) machine:(Machine *)machine fatalErrorOccured:(Error *)error; 
    - (BOOL) machine:(Machine *)machine shouldContinueAfterProductionError:(Error *)error; 
@optional 
    - (void) machineDidEnterEcoMode:(Machine *)machine; 
    - (void) machine:(Machine *)machine didProduceStuff:(Stuff *)stuff; 
@end 

代表們還可以用來改變對象的行爲,而不繼承它:

@protocol MachineDelegate <NSObject> 
@required 
    - (Color *) colorForStuffBeingProducedInMachine:(Machine *)machine; 
    - (BOOL) machineShouldGiftWrapStuffWhenDone:(Machine *)machine; 
@end 

我希望我可以幫你瞭解的好處使用委託一點點抽象你的代碼。

+2

令人驚訝的全面的答案。謝謝! – 2012-01-28 17:25:34

+2

優秀!在閱讀完這個答案後開始理解代表:) – 2013-02-02 05:01:34

+0

這是迄今爲止我遇到的最好的Objective-C委託示例 – 2013-05-12 16:28:34

1

瞭解MVC模型和使用的協議和通知是爲了把握代表的用途和目的的關鍵。將它們視爲與特定操作相關的不同事件的響應者類型。

赫拉是一些有用的鏈接在計算器:

希望它可以幫助

0

代表們從其他類

越來越回調那麼爲什麼要使用委託有用: 就是我們所說的方法,一類...這是正常的......如果我們想實例化類,讓我們再打......這就是代表就派上用場了......

簡單的例子: ü使用的方法的網站上下載的歌曲 一個類一旦類完成下載ü希望類讓你知道.. 。

//protocol declaration 
    @protocol DownloadProtocol <NSObject> 
    -(void)OnFinish; 
    @end 

//SOng download class 
@interface songs 
@property(Strong,nonatomic) id<DownloadProtcol> delegate; 
-(void)Download; 
@end 
@implementation songs 
-(void)Download 
{ 

///the code to download goes here 

[self callTheCallingClass]; 

} 

-(void)CallTheCallingClass 
{ 
[self.delegate OnFinish]; 
} 
@end 

// 
@interface mainclass<DownloadProtocol> 

@end 

@implementation mainclass 

-(void)viewDidload 
{ 
Songs *s=[[SOngs alloc]init]; 
s.delegate=self; 
[s download]; 
} 
-(void)OnFinish 
{ 
    NSlog(@"Called"); 
} 
@end 

1)見代表團通過在目標C 我覺得你可以理解它的語法協議實現...

2)在歌曲類,我們創建了該協議 一個屬性,我們把它的類型作爲ID ... bcuz類型在編譯時不知道。

3)在歌曲類中,一旦我們完成下載,我們稱之爲協議方法...

4)在主類第一我們採用協議 語法 類 以上是該

5語法)的我們實例的歌曲類

6)然後,指定主類對象(個體)委派歌曲類的

7)那麼就需要通過從協議添加方法名稱申請中的.m 協議類別

8),所以從現在起,每當歌曲類調用通過委託實例變量的協議方法....對主類進行通訊協定方法通過獲取運行

試試這個代碼,希望它可以幫助...

如果u想了解更多相關信息穀歌,不如授人設計模式

主要benifit是 它促進了鬆耦合的編程...