2012-01-28 118 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是 它促进了松耦合的编程...