UI023: 通知NSNotification的基本使用

通知:

  • 通知的发布
  • 通知的监听
  • 通知的移除

NSNotificationCenter

发布通知

-(void)postNotification:(NSNotification *)notification;
可以在notification对象中,设置通知的名称,发布者,额外信息等。
-(void)postNotificationName:(NSString *)name object:(id)obj;
发布1个名称为name的通知,obj为这个通知的发布者。
-(void)postNotificationName:(NSString *)name object:(id)obj userInfo:(NSDictionary *)userInfo;
userInfo: 为额外信息。

监听通知: 监听通知,必须在发布通知之前,必须先监听,再发送通知。
NSNotification,对1个通知的封装。

通知的使用。

// 通知的发布者
// NotificationSender.h
@interface NotificationSender :NSObject
// 通知发布者名称
@property(nanotomic, copy) NSString *name;
@end

//----------------------
// NotificationSender.m
@implementation NotificationSender
@end

// 通知的监听者

// NotificationListener.h
@interface NotificationListener :NSObject
// 接受者名称
@property(nanotomic, copy) NSString *name;
// 监听通知方法, 回调的时候,会自动给参数noteInfo赋值。
-(void)method1:(NSNotification *)noteInfo;
@end

//----------------------
// NotificationListener.m
@implementation NotificationListener
// noteInfo中有:name监听的通知的名称, 
// object:监听到的通知是那个对象发布的,
// userInfo: 1个字典,这个字典中包含了通知的具体内容.

- (void)method1:(NSNotification *)noteInfo
{
    NSLog(@"-------method1方法被调用");
    NSLog(@"%@", noteInfo);
}

- (void)dealloc
{   // 移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end

int main(int argc, const char * argv[]) {
  @autoreleasepool {
    // 通知的发布者
    NotificationSender *sender1 = [[NotificationSender alloc] init];
    // 通知的监听者
    NotificationListener *listener1 = [[NotificationListener alloc] init];
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];

    // 监听通知。
    // 参数1:要监听通知的对象
    // 参数2:该对象的哪个方法,用来监听这个通知
    // 参数3:被监听的通知的名称。
    // 3.1 当参数3为nil,表示所有的通知,表示凡是sender1对象发布的所有的通知,都会监听到。
    // 3.2 如果指定了参数3,指定要监听某个通知,但是没有指定参数4. 那么表示无论是哪个发布的,只要通知名称一样,都会被监听到。
    // 3.3 如果参数3和参数4都是nil,所有对象发布的所有的通知,这个方法都会监听到。

    // 参数4:发布通知的对象sender1。 方法名称,要带上冒号:
    [notificationCenter addObserver:listener1 
        selector:@selector(method1:)  
        name:@"tzname1" 
        object:sender1];

    // 通过notificationCenter发布通知。
    // 参数1:通知名称
    // 参数2:通知的发布者(发布通知的对象)
    // 参数3:通知的具体内容
    [notificationCenter postNotificationName:@"tzname1" 
        object:sender1 
        userInfo:@{
            @"title":@"两会准备开始了", 
            @"content":@"成龙也来参加会议了。"
            }];

    // 移除通知:当listener1被销毁了。仍然发送通知,还是会调用对象的method1方法,就会野指针错误。

  }
  return 0;
} 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一 酒,是身外的血液,等待收集,等待鲜红、浓稠和温暖的脉动。身体也在等待,等待足够湍急的波浪、足够厚实的堤岸。 春...
    木文言武阅读 420评论 0 35
  • 壮丽的内蒙 (一) 内蒙是真的大,汽车从呼和浩特出发,经过武川,一路向北,沿途是绵延无尽的荒原、山脉、丛林,常常许...
    小叶书虫阅读 222评论 0 1
  • 昨晚构思未成竟睡着了!就用曾和诗友《七律》中的一句应急吧! 篱边腐乳红星酒; 案上鲜蔬紫米粥。 王岐君期待老师们的...
    诗图佳得阅读 108评论 2 1
  • 浩渺寒江之上弥漫着迷蒙的烟雾,皓月的清辉洒在白色沙渚之上。 灯初上,夜未凉,我将小舟泊在秦淮河畔,临近酒家。 迎岸...
    映月池上阅读 51评论 0 0
  • 57岁的巩俐、43岁的汤唯、35岁的张雨绮状态都太好了!今年戛纳神仙打架! 这几天时尚圈最热闹的事,就是戛纳红毯了...
    修马修勾阅读 135评论 0 1

友情链接更多精彩内容