About protocol & delegate

About protocol & delegate_第1张图片
Paste_Image.png

引入几个概念

  • 协议方

协议方最好另起一个.h ,协议方内的optional / required,我称它为——协议函数——,这里只有声明协议函数

  • 委托方

——委托函数——,就是上面的 doWork , ——委托函数—— 中让代理去实现协议方的——协议函数—— : doSomeRequiredWork/doSomeOptionalWork

  • 代理方

新建一个委托方类,实现 ——协议函数——

下面是说明

  • 协议方

协议方没什么好说的,格式正确即可

  • 委托方

** 委托方不实现协议,代理方是委托方的属性变量,通过后续赋值来实例化之 **

  • 协议要么单独写一个.h,要么写在委托方,最后代理方导入委托方的.h。避免多个代理的时候,委托方要导入很多次(看个人习惯,我觉得这样写比较好)
  • 下面是完整的委托方代码 注意第四行

代理方 是 委托方的属性变量,委托方必须遵循协议方的内容!!!

/*****************************************************************/
// ———————————————————— Manager.h 类 ————————————————————
@interface Manager:NSObject
//代理方 是 委托方的属性变量,委托方必须遵循协议方的内容!!!
@property (strong,nonatomic) id delegate; 
-(void)doWork;
@end
// ———————————————————— Manager.m 类 ————————————————————
#import Manager.h
@implementation Manager
-(void)doWork // 委托函数,有些情况是需要传参
{
    [self.delegate doSomeRequiredWork];// 1. 代理方必须实现的内容!
    // 2. 判断某个代理方是否存在可选实现的内容 !
    if ([self.delegate respondsToSelector:@selector(doSomeOptionalWork)])
    {
        [self.delegate doSomeOptionalWork];//存在,执行worker可选的内容
    }
    [self myWork]; // 3. 委托方自己要实现的内容!
}
-(void)myWork
{
    NSLog(@"do manager's work");
}
@end
  • 代理方

    • 代理方可以存在多个,只要实现委托方交给的协议就可以了!下面是举例两个代理方的代码. 包含两个类
  • 其一 Worker_One
/*****************************************************************/
// Worker_One.h
@interface Worker_One:NSObject
-(void)doSomeRequiredWork;//遵循协议必须实现的函数
@end
// Worker_One.m
#import Worker_One.h
@implementation Worker_One
-(void)doSomeRequiredWork
{
    NSLog(@"do Worker_One's Job");
}
@end
  • 其二
/*****************************************************************/
// Worker_Two.h
@interface Worker_Two:NSObject
-(void)doSomeRequiredWork;//遵循协议必须实现的函数
-(void)doSomeOptionalWork;//woker two 有实现可选操作
@end
// Worker_Two.m
#import Worker_Two.h
@implementation Worker_Two
-(void)doSomeRequiredWork
{
    NSLog(@"do Worker_Two's Job");
}
-(void)doSomeOptionalWork
{
    NSLog(@"My optional work,I'm worker two");
}
@end
  • 最后的综合调用
-(void)ViewDidLoad
{
    Manager* manager = [Manager new];
    Worker_One *w_1  = [Worker_One new];
    Worker_Two *w_2  = [Worker_Two new];
    manager.delegate = w_1;
    [manager doWork];
    manager.delegate = w_2;
    [manager doWork];
}

如果情况为 自己 委托 自己作为代理,实现协议函数

则无所谓在@property中设定 id<协议名> 代理方

这时候, 委托函数传入的值就是self, 协议函数也在同一 .m中,

如我们的sdk里的例子

1. `- (void)initializeAudioDriver`
2. `{`
3. ` // 音频连接参数`
4. ` id\ params = [[NLAudioPortV100ConnParams alloc] init];`
5. ` // 请求连接并获取ME11终端设备`
6. ` NSError \*err = nil; // 驱动连接设备错误指针`
7. `***// ———————— 委托函数 ——————————***`
8. ` self.device = [self.driver connectWithConnParams:params`
9. **` closedListener:self // 代理方:id\<某协议\>,此处委托自己`**
10. **` launchListener:self // `****`代理方:id\<某协议\>,此处委托自己`**
11. ` error:&err];`
12. ` if (err || !self.device) { // 获取失败`
13. ` [self performSelectorOnMainThread:@selector(onDeviceConnectFailed:) withObject:[NSString stringWithFormat:@"%@", err] waitUntilDone:NO];`
14. ` return ;`
15. ` }`
16. ` NSLog(@"Audio device instance %@", self.device);`
17. ` [self performSelectorOnMainThread:@selector(onDevicecConnectSuccess) withObject:nil waitUntilDone:NO];`
18. `}`

下面是协议函数 onEvent

    1. `- (void)onEvent:(id \)event`
    2. `{`
    3. ` NSLog(@"onEvent : %@", event);`
    4. ` // TODO判别事件类型并做相应处理`
    5. ` if ([event isKindOfClass:[NLConnectionCloseEvent class]]) {`
    6. ` [(UINavigationController\*)self.window.rootViewController topViewController].title = @"设备断开连接";`
    7. ` if ([self.viewController respondsToSelector:@selector(addText:)]) {`
    8. ` [self.viewController performSelector:@selector(addText:) withObject:@"设备断开连接!!!"];`
    9. ` }`
    10. ` `
    11. ` } else if ([event isKindOfClass:[NLDeviceLaunchEvent class]]) {`
    12. ` NLDeviceLaunchEvent \*launchEvent = (NLDeviceLaunchEvent\*)event;`
    13. ` if ([launchEvent isSuccess]) {`
    14. ` // 0xA5 + Len(2B) + 0x3A + 固件版本号(1B) + ksn + CRC(1B) + 0x5A`
    15. ` NSData \*data = [launchEvent userInfo][NLDeviceLaunchDataInfo];`
    16. ` if (data.length \> 7) {`
    17. ` NSLog(@"KSN : %@", [NLISOUtils hexStringWithData:[data subdataWithRange:NSMakeRange(5, data.length - 7)]]);`
    18. ` }`
    19. ` }`
    20. ` } else if ([event isKindOfClass:[NLDeviceMenuEvent class]]) {`
    21. ` NLDeviceMenuEvent \*menuEvent = (NLDeviceMenuEvent\*)event;`
    22. ` NSString \*text = nil;`
    23. ` if ([menuEvent isSuccess]) {`
    24. ` text = [NSString stringWithFormat:@"menu keycode:%d ,ecode: %@", [menuEvent keyCode], [menuEvent eCode]];`
    25. ` } else {`
    26. ` text = [NSString stringWithFormat:@"menu event failed!error: %@", [menuEvent error]];`
    27. ` }`
    28. ` [self.viewController performSelector:@selector(addText:) withObject:text];`
    29. ` }`
    30. `}`

你可能感兴趣的:(About protocol & delegate)