在可可的委託模式用來通知(報告進展情況等)或查詢(要求提供憑證等)另一個對象,而不瞭解它。
通常,您使用協議來定義您將在委託上調用哪些方法,然後委託需要遵守該協議。您還可以添加代理不需要實現的方法(可選)。當你這樣做時,你必須調用-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
我希望我可以幫你瞭解的好處使用委託一點點抽象你的代碼。
這裏http://stackoverflow.com/questions/30662032/ios-callback-function -from-library你可以找到代表的實現細節。 – 2015-12-17 06:43:46