• iOS 关于NSNotificationCenter


    通常我们在 iOS 中发生什么事件时该做什么是由 Delegate 实现的,  Apple 还为我们提供了另一种通知响应方式,那就是 NSNotification.

    NSNotificationCenter 较之于 Delegate 可以实现更大的跨度的通信机制,可以为两个无引用关系的两个对象进行通信。NSNotificationCenter 的通信原理使用了观察者模式(KVO):三步骤  1在需要实施的地方注册  2并 写好触发的事件  3在需要触发该事件的地方激发

    1. NSNotificationCenter 注册观察者对某个事件(以字符串命名)感兴趣,及该事件触发时该执行的 Selector 或 Block
    2. NSNotificationCenter 在某个时机激发事件(以字符串命名)
    3. 观察者在收到感兴趣的事件时,执行相应的 Selector 或 Block
    4. 注销观察者 这个对应注册 一般在selector方法里 ,也相对于注册的时机 一般是 viewWillappear 注册 viewWillDisapper 注销
    //
    //  SecondViewController.m
    //  StoryBoard
    //
    //  Created by HF on 15/1/12.
    //  Copyright (c) 2015年 YLYL. All rights reserved.
    //
    
    #import "SecondViewController.h"
    #import "BasicFunctuin.h"
    @interface SecondViewController ()
    
    @end
    
    @implementation SecondViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //注册通知 通知实施方法是update  激活关键字是 @"update"
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update) name:@"update" object:nil];
    }
    //触发方法
    -(void) update { DLog(@"KVO");

         //观察者注销,移除消息观察者

          [[NSNotificationCenter defaultCenter]removeObserver:self name:@"update" object:nil];

    }
    @end
    //
    //  FirstViewController.m
    //  StoryBoard
    //
    //  Created by wzyb on 14-12-11.
    //  Copyright (c) 2014年 YLYL. All rights reserved.
    //
    #import "FirstViewController.h"
    @interface FirstViewController ()
    
    @end
    
    @implementation FirstViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
     
    -(void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:YES];
    //实施通知 在此时触发关键字@"update" 的通知方法 只要是该关键字 方法都执行 [[NSNotificationCenter defaultCenter] postNotificationName:
    @"update" object:nil]; } @end
    虽然在 IOS 用上 ARC 后,不显示移除 NSNotification Observer 也不会出错,但是这是一个很不好的习惯,不利于性能和内存。

      移除通知:removeObserver:和removeObserver:name:object:其中,removeObserver:是删除通知中心保存的调度表一个观察者的所有入口,而removeObserver:name:object:   是删除匹配了通知中心保存的调度表中观察者的一个入口。

    这个比较简单,直接调用该方法就行。例如:

    
    

    [[NSNotificationCenter defaultCenter] removeObserver:observer name:nil object:self];

    
    

    注意参数notificationObserver为要删除的观察者,一定不能置为nil。

    
    注销观察者有2个方法:
    
    a. 最优的方法,在 UIViewController.m 中:
    
    -(void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    现在arc中一般post b. 单个移除: [[NSNotificationCenter defaultCenter] removeObserver:self name:
    @"Notification_GetUserProfileSuccess" object:nil];
  • 相关阅读:
    HDU 5583 Kingdom of Black and White 水题
    HDU 5578 Friendship of Frog 水题
    Codeforces Round #190 (Div. 2) E. Ciel the Commander 点分治
    hdu 5594 ZYB's Prime 最大流
    hdu 5593 ZYB's Tree 树形dp
    hdu 5592 ZYB's Game 树状数组
    hdu 5591 ZYB's Game 博弈论
    HDU 5590 ZYB's Biology 水题
    cdoj 1256 昊昊爱运动 预处理/前缀和
    cdoj 1255 斓少摘苹果 贪心
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/4222352.html
Copyright © 2020-2023  润新知