iOS 发送通知后多次响应通知方法

最近在用通知执行某方法的时候,遇到了一个发送一次通知却多次执行通知方法的问题。

问题再现

1、注册通知(添加观察者),这里采用的是block回调方式去执行通知方法,而并非常用的addObserver:selector:name:object:


[[NSNotificationCenter defaultCenter] addObserverForName:URLookExpandCloth object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {

    // 执行你想做的事情

    }];

2、发送通知

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

3、移除通知

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

结果

通知方法的block回调多次执行。

问题原因

这是因为移除通知的地方不对,不应该采用 [[NSNotificationCenter defaultCenter] removeObserver:self];这种方式去移除,因为这里采用的注册通知的方式是block,平常我们注册通知一般是这样做:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(xxxx:) name: URLookExpandCloth object:nil];

这两种注册通知的方法区别在于,block方式有返回值,addObserver没有返回值,block那种方式,返回值实际上就是观察者,我们必须用一个对象去接收这个返回值,然后再移除该返回值(观察者)

解决办法

改的实际上就是上面的第一步和第三步
1、先定义一个全局属性,用于接收注册通知时的返回值

@property (nonatomic, strong) id noty;

2、


_noty =  [[NSNotificationCenter defaultCenter] addObserverForName:URLookExpandCloth object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {

    // 执行你想做的事情

    }];

3、移除通知

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:_noty];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,712评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,362评论 0 11
  • 关于离别 依然清晰记得6号当我黯然离去,西安体育场外依然还有群情激愤不肯离去的球迷,是的,他们一直在喊着“蔡振华,...
    是经久也是有人阅读 270评论 0 1
  • 中国文化源远流长,而文学也不例外,一直可以追溯到远古时期。文学以神话传说和歌谣为主,描述远古人们农业生产和祭祀...
    陆泳年阅读 684评论 1 0