在可可的委托模式用来通知(报告进展情况等)或查询(要求提供凭证等)另一个对象,而不了解它。
通常,您使用协议来定义您将在委托上调用哪些方法,然后委托需要遵守该协议。您还可以添加代理不需要实现的方法(可选)。当你这样做时,你必须调用-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