oc回调的几种方式
春招也在找到实习后结束了,实习时候由于组内缺人,也被调整到了ios组,也是开始了ios的学习,虽然开始学习一门新的技术是困难的,而且还是从Java转到了oc语言,但是人生本来就是一个不断学习的过程,不是吗?
这里总结一下oc语言中的回调机制。类似于Android中的interface callback回调的方式,oc中也有几种实现回调的方式,但是总的来说,实现都是我们会通过某种途径,将一段代码和一个特定的事件联系起来,当特定事件发生后,这段代码才会被执行。
这里主要介绍一下oc中的4种回调
- Target-action回调
- delegate方式
- Notifications 方式
- block方式
Target-action回调
[button addTarget:self action:@selector(onClick:)
forControlEvents:UIControlEventTouchUpInside];
这里我们传入了onclick方法,但是onclick方法并不会立即执行,他会在具体的click事件执行过后,才会执行onclick方法,完成了回调
delegate方式
delegate 在oc中是类似于 Android中的interface的作用,首先定义一个delegate,通过外部设置delegate,外部方法传入了delegate方法后,并不会立即执行,而是当前的事件触发过后才会执行
#import < Foundation/Foundation.h >
@protocol MyDelegate <NSObject>
@optional
- (void)doSomeThing(); //定义delegate中的方法
@end
@interface MyDelegateManager : NSObject
@property (weak) id<MyDelegate> delegate; //软引用持有delegate方法,防止相互引用
@end
import "MyDelegateManager.h"
@interface MyDelegateManager ()
@end
@implementation MyDelegateManager
-(void)dothing(){
if(delegate){
[self.delegate doSomeThing]; //这里执行delegate回调
}
}
@end
#import "ViewController.h"
#import "MyCnetralManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
MyDelegateManager *manager = [[MyDelegateManager alloc] init];
manager.delegate = self; //将delegate设置为自身
}
- (void)doSomething() { //这里实接口的具体实现,当调用后会执行自身的逻辑
//dosomething
}
@end
Notifications方式
oc中提供了Notifications方式为我们发送通知的方式,类似于Android中的广播,同样也是用到了观察者模式,首先我们需要注册一个notifacation,然后其就会接受来自外部的信息,当接受到信息后,就会执行相应的方法。
/*
第一个参数指需要注册的对象
第二个参数指需要执行的方法
第三个是需要相应的名称
第四个是接受谁发出的通告,nil表示都接受
*/
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(doSomething:)
name:kNotification
object:nil];
/*
第一个参数指需要发送至的对象
第二个参数指发送的对象
第三个参数是指需要发送的额外信息
*/
[[NSNotificationCenter defaultCenter] postNotificationName:kNotification
object:nil
userInfo:nil];
block方式
block是一种类似Java中匿名内部类的形式,在上面的notifacation中,我们可以直接通过block来实现
[[NSNotificationCenter defaultCenter] addObserverForName:kNotification
object:nil
queue:nil
usingBlock:^(NSNotification * _Nonnull note) {
//doSomething
}];
同样我们也可以block当做一个接口来实现回调。