任何人都可以通过实时场景解释iphone sdk中的DELEGATE定义。
抱歉我的问题很糟糕。
提前致谢。
答案 0 :(得分:3)
委托是一个对象,它将在未来的某个时刻响应预先选择的选择器(函数调用)。
假设我使用类FancyAsynchronousURLGetter的对象异步(在后台)加载URL。由于它在后台运行,我希望能够在加载URL时去做其他事情,然后在准备就绪时收到通知。通过在FancyAsynchronousURLGetter上使用委托并编写适当的代码,我可以指定一个具有特定选择器的对象,当FancyAsynchronousURLGetter完成时将调用该对象。像这样:
- (void)loadView
{
...
FancyAsynchronousURLGetter* getter = [[FancyAsynchronousURLGetter alloc] initWithURL:url];
[getter setDelegate:self];
/*
getter will call either
- (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g
or
- (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g
on its delegate, depending on whether load succeeded or failed
*/
[getter start];
...
}
- (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g
{
NSLog(@"Load succeeded.");
}
- (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g
{
NSLog(@"Load failed.");
}
和FancyAsynchronousURLGetter本身:
- (void)start
{
[self performSelectorInBackground:@selector(fetchURL) withObject:nil];
}
- (void))fetchURL
{
Fetch the URL synchronously
if ( success )
[delegate fancyAsynchronousURLGetterLoadSucceeded:self]; // note: probably want to call this on the main thread
else
[delegate fancyAsynchronousURLGetterLoadFailed:self];
}
答案 1 :(得分:2)
以下是要了解的示例代码。
协议定义
#import <Foundation/Foundation.h>
@protocol ProcessDataDelegate <NSObject>
@required
- (void) processSuccessful: (BOOL)success;
@end
@interface ClassWithProtocol : NSObject
{
id <ProcessDataDelegate> delegate;
}
@property (retain) id delegate;
-(void)startSomeProcess;
@end
协议实施
#import "ClassWithProtocol.h"
@implementation ClassWithProtocol
@synthesize delegate;
- (void)processComplete
{
[[self delegate] processSuccessful:YES];
}
-(void)startSomeProcess
{
[NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector: @selector(processComplete) userInfo:nil repeats:YES];
}
@end
要充分了解,visit here...
答案 2 :(得分:0)
简短:委托是两个对象之间的一对一关系,允许一个人在另一个对象上调用方法,它让被调用者自定义实现该方法。
Delegation允许您编写自定义实现方法的自定义实现。
例如UITableView's Delegate和datasource(技术上与委托相同)允许UITableView让其他类重要的任务(如创建单元格)显示在tableview中并响应事件(例如,点击) tableview中的一个单元格。
要首先使用委托,您需要定义协议:
@protocol protocolNameHere
- (void) sampleMethodHere;
@optional
- (void) implementingThisMethodIsOptional;
@end
然后你必须在“&lt;&gt;”中添加协议的名称在您想要委派的类的头文件的前面。该类现在符合该协议。你需要在这个类中实现该方法。
如果有多个代理人,则用逗号分隔,例如
答案 3 :(得分:0)
委托不依赖于您使用的语言或平台,它是一种设计模式。我建议你阅读Delegation pattern以获得基本的理解。在那之后,我认为你可以寻求进一步的理解。