理论知识点
NotificationCenter 通知中心:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;
delegate 代理委托:“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
- block(闭包) block和delegate一样,一般都是“一对一”之间通信交互,相比代理block有以下特点
1.写法更简练,不需要写protocol、函数等等
2.block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
3.block需要注意防止循环引用
1、在.h中声明代理和block
#import <Foundation/Foundation.h>
// 声明一个delegate和block
typedef void(^clickBackBlock)(void);
@protocol Block_DelegateClass <NSObject>
- (void)clickBackDelegate;
@end
@interface Block_DelegateClass : NSObject
@property (nonatomic, weak) id<Block_DelegateClass> delegatel;
@property (nonatomic, copy) clickBackBlock block;
- (void)doSomething;
@end
2、doSomething中让他的代理去实现
#import "Block_DelegateClass.h"
@implementation Block_DelegateClass
- (void)doSomething {
/**
* block和代理的调用区别
*/
if (self.block) { // 判断block是否指向了某个block实体 ^(传入参数列){行为主体};
self.block(); // 执行指向的block实体的代码块 ^{}
}
if (self.delegatel) { // 判断delegate是否有对象赋值
[self.delegatel clickBackDelegate]; // 调用代理方法
}
}
@end
3、外部的某个类成为A类的代理
#import "OneViewController.h"
#import "Block_DelegateClass.h"
@interface OneViewController ()<Block_DelegateClass>
@property(nonatomic, strong) Block_DelegateClass *blockAnddeleagate;
@end
@implementation OneViewController
- (void)viewDidLoad {
[super viewDidLoad];
_blockAnddeleagate = [[Block_DelegateClass alloc] init];
_blockAnddeleagate.block = ^{ // 让block指向一个实体代码块,等待被调用时候执行
NSLog(@"我是block体,我替别人doSomething");
};
_blockAnddeleagate.delegatel = self; // self 成为代理对象
[self callMethod];
// Do any additional setup after loading the view.
}
#pragma mark - Block_DelegateClass
// 实现代理方法
- (void)clickBackDelegate {
NSLog(@"我是代理,我替别人doSomething");
}
#pragma mark - event Method
- (void)callMethod {
[_blockAnddeleagate doSomething];
}
@end