在移动端开打过程中,经常会用到通知和推送,例如有短信来了需要通知提示,手机横屏了需要通知提示,插上耳机了需要通知提示等等,我们可以根据这些通知采取对应的动作。iOS系统自身定义了很对通知,但是在开发过程中我们也可以进行自定义一些通知,然后利用NSNotificationCenter在需要的时候进行发送通知,在接收到通知时采取对应的动作。
通知的学习其实很简单,首先我们需要注册通知,这样才能接收到对应类型的通知,并定义接收到通知时所采取的动作;其次就是我们需要学会在何时发送通知,当然,对于iOS系统定义的通知的发送是自发的,不需要我们进行发送,当然我们也可以用这种方法进行模拟发送系统定义的通知;最后我们需要了解的就是如何移除通知。
在开始之前,我们首先了解一下系统定义了那些通知,官网的定义如下:NSNotificationName。大家有需要可以自行查看,由于太多,所以建议大家在需要用到通知类的时候直接找度娘问有没有对应的通知类名,有则去官网找对应的解释和说明,没有则进行自定义。
下面的内容主要来源于文章:iOS创建添加通知、发送通知、移除通知。
1 创建通知
关于创建通知,最好是在viewDidLoad的方法中创建
- (void)viewDidLoad { [super viewDidLoad]; //创建通知 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:) name:@"tongzhi" object:nil]; } //接收通知并相应的方法 - (void) tongzhi:(NSNotification *)notification{ NSDictionary *dic = notification.object; // NSLog(@"通知过来的 - dic = %@",notification.object); }
2 发送通知
//配置发送的通知携带的参数 NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@"324234",@"bankId",@"某某银行",@"bankName", nil]; //通过通知中心发送通知 [[NSNotificationCenter defaultCenter] postNotificationName:@"tongzhi" object:dic];
3 移除通知
根据谁创建,谁负责的原则,一般是创建通知的那个控制器来移除通知,最好在dealloc方法中移除,如果通知不能及时的移除掉,当下次进入该控制器时会重复创建NSNotificationCenter,在对应方法中发送通知给上一次创建的通知,但是上一个通知所在的控制器已被干掉,所以这时候就会报错。
-(void)dealloc{ //第一种方法.这里可以移除该控制器下的所有通知 // 移除当前所有通知 NSLog(@"移除了所有的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self]; //第二种方法.这里可以移除该控制器下名称为tongzhi的通知 //移除名称为tongzhi的那个通知 NSLog(@"移除了名称为tongzhi的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil]; }
注意:如果dealloc方法不调用,说明当前有变量没有被释放,这时如果找不到问题所在,也可以重写控制器的返回按钮backBarButtonItem事件,在返回的时候进行移除通知操作。此外,如果dealloc不调用,说明存在内存泄漏,这个问题是必须要解决的,在iOS开发过程中,对内存泄漏的管理是非常严格的,我们务必做好这方面的工作,具体关于内存泄漏问题的注意事项和查找方法可以参见我之前的一篇随笔:iOS学习——内存泄漏检查及原因分析
//返回上一层界面事件 -(void)backPreviousViewControllerAction{ //第一种方法.这里可以移除该控制器下的所有通知 // 移除当前所有通知 NSLog(@"移除了所有的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self]; //第二种方法.这里可以移除该控制器下名称为tongzhi的通知 //移除名称为tongzhi的那个通知 NSLog(@"移除了名称为tongzhi的通知"); [[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil]; // 返回上一层界面 [self.navigationController popViewControllerAnimated:YES]; }