NSNotification通知正确使用模板

一.系统消息
1.最近项目中发现通知使用不当,会导致通知回调不是一一对应,有时候会回调两次,导致绑定监听的方法会多次调用(我们程序就页面回退了多次,因为我们绑定的是页面回退的方法)
原因:就是通知注册和移除不对应导致。
2.如果你的页面是 UIView,那很简单可以直接有下面一个函数就搞定

#pragma mark - keyboard
- (void)willMoveToWindow:(UIWindow *)newWindow //(willMoveToWindow为 UIView接口)注册键盘相关通知
{
    if (newWindow) {
        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
        [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object: nil];
    }
    else
    {
        [[NSNotificationCenter defaultCenter] removeObserver: self];//移除
    }
}

或者(以下是我们自己封装的接口,就是页面显示完成,页面消失完成两个接口)

- (void)componentDidDisplay
{
     [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
}

- (void)componentDidDisappear
{
     [[NSNotificationCenterdefaultCenter]removeObserver:self];
}

3.如果你的页面是 UIViewController
有两方法 推荐用第一种

//法1(页面将要显示的时候添加,页面将要消失的时候移出)
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver: self];
}

法2 (页面创建的时候添加 viewDidLoad, 页面销毁的时候移出 dealloc)
不推荐的原因是 ARC模式下(MRC一样)如果block循环引用或计时器之类的使用不当,会导致dealloc不调用,也就导致通知不对应

//页面创建的时候添加 viewDidLoad, 页面销毁的时候移出 dealloc
- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object: nil];
}

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver: self];
}

2017年1月5日
二.自定义消息
以上页面由于发送的是系统通知UIKeyboardWillShowNotification,不需要调用postNotificationName
1.自定义消息除了正确参考系统消息写法外,还要自己发通知
公共宏页面

#define kRrefreshPasswordNotification        @"huRefershPassword"

A页面//发通知

[[NSNotificationCenter defaultCenter] postNotificationName:kRrefreshPasswordNotification object:nil];  

B页面//注册消息和方法--初始化时候写 (参照系统消息写法)

[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(refreshData:) name: kRrefreshPasswordNotification object:nil];  
[[NSNotificationCenter defaultCenter] removeObserver: self];
-(void)refreshData:(NSNotification*)notification
{
    NSDictionary *param = [notification object];//通过这个获取到传递的对象
    [self _unlockSubmitButton];
    [self reloadBankAndMoney];
}
  • (void)addNotifictionListener
    {
    [kNotificationCenter addObserver:self selector:@selector(receiveSocketData:) name:kRefreshPushCourceNotification object:nil];
    }

  • (void)removeNotificationListener
    {
    [kNotificationCenter removeObserver: self];
    }
    如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。

你可能感兴趣的:(NSNotification通知正确使用模板)