澳门威利斯人_威利斯人娱乐「手机版」

来自 办公软件 2020-05-01 05:58 的文章
当前位置: 澳门威利斯人 > 办公软件 > 正文

异步发送和接收通知,通知机制概念

一、通告的主干使用

每三个应用程序都有多个通报宗旨,专责扶持区别 对象时期的音信通讯。

别的八个指标都足以向通知宗旨发布布告,描述本人在做哪些。其余感兴趣的指标足以报名在有个别特定通知公布时(或在有个别特定的对象公布文告时)收到那些布告。

//一个通知一般包含三个属性:@property (readonly, copy) NSString *name;//通知名称@property (nullable, readonly, retain) id object;//通知发布者@property (nullable, readonly, copy) NSDictionary *userInfo;//一些额外的信息(通知发布者传递给通知接收者的信息内容) //初始化一个通知:(NSNotification)对象   (instancetype)notificationWithName:(NSString *)aName object:(nullable id)anObject;   (instancetype)notificationWithName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo; //发布通知方法(通知中心提供了相应的方法来帮助发布通知) //1.发布一个notification通知,可在notification对象中设置通知的名称,通知发布者、额外的信息等- postNotification:(NSNotification *)notification; //2.发布一个名称为aName的通知,anObject为这个通知的发布者- postNotificationName:(NSString *)aName object:(nullable id)anObject; //3.发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息- postNotificationName:(NSString *)aName object:(nullable id)anObject userInfo:(nullable NSDictionary *)aUserInfo;

在那地举个例证,譬如此处有腾讯网和Tencent快讯在公布音讯。张三向往收听娱乐新闻,李四合意收听好笑音信。当微博和Tencent发出的音信一经是游戏音信张三都能收听到,发出的消息一经是好笑音信李四都能收听到,怎么贯彻啊,看如下代码:

//首先创建一个新闻发布类,有一个属性名字#import <Foundation/Foundation.h>@interface NewsCompany : NSObject@property (nonatomic, copy) NSString *name;@end//再创建一个Person类(有一个name属性和接收到新闻后做出的回应)@interface Person : NSObject@property (nonatomic, copy) NSString *name;//接收到消息后触发的方法- newCome:(NSNotification *)note;@end//Person.m文件中实现接收到通知后的方法#import "Person.h"#import "NewsCompany.h"@implementation Person- newCome:(NSNotification *)note{ //取到通知发布者 NewsCompany *obj = note.object; NSLog(@"%@接收到%@的通知,通知内容是:%@",self.name,obj.name, note.userInfo);}//通知中心不会保留监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃- dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self];}//然后我们在ViewController.m文件中实现他们//首先创建两个新闻发布的对象NewsCompany *company = [[NewsCompany alloc] init];company.name = @"腾讯新闻"; NewsCompany *sian = [[NewsCompany alloc] init];sian.name = @"新浪新闻";//初始化两个人 Person *zhansan = [[Person alloc] init]; zhansan.name = @"张三"; Person *lisi = [[Person alloc] init]; lisi.name = @"李四"; //模拟发布通知 //初始化通知中心 NSNotificationCenter *center = [NSNotificationCenter defaultCenter];//注册通知监听器 /** * 注册一个监听通知的监听器 * * @param observer 监听器,即谁要接收这个通知 * @param aSelector 收到通知后,回调监听器这个方法,并且把通知对象当做参数传入 * @param aName 通知的名称,如果为nil,那么无论通知名称是什么,监听器都能收到这个通知 * @param anObject 通知发布者(如果为nil,不关心是谁发布的通知,可以更具通知的名称来获得哪条通知,如果aName和anObject都为nil) */// - addObserver:observer selector:aSelector name:(nullable NSString *)aName object:(nullable id)anObject;//注册一个张三要接收军事新闻的监听器,接收到消息后会调用- newCome:(NSNotification *)note方法[center addObserver:zhansan selector:@selector name:@"junshi_new_come" object:nil];[center addObserver:lisi selector:@selector name:@"gaoxiao_new_come" object:nil];//发布通知//腾讯发布了一侧通知[center postNotificationName:@"junshi_new_come" object:company userInfo:@{@"title":@"哈哈哈哈哈我的武器好厉害",@"intro":@"哈哈哈哈哈我的武器好厉害......"}];//新浪发布了一条搞笑新闻[center postNotificationName:@"gaoxiao_new_come" object:sian userInfo:@{@"title":@"哈哈哈太搞笑了"}];//然后运行工程打印如下:2016-09-12 22:08:07.552 通知的使用[1748:85334] 张三接收到腾讯新闻的通知,通知内容是:{ intro = "U4f0aU62c9U514bU6218U4e89U505cU6b62U4e86......"; title = "U4f0aU62c9U514bU6218U4e89U505cU6b62U4e86";}2016-09-12 22:08:07.552 通知的使用[1748:85334] 李四接收到新浪新闻的通知,通知内容是:{ title = "U54c8U54c8U54c8U592aU641eU7b11U4e86";}//证明张三和李四都接收到了各自喜爱的新闻
  • 在通报中央登记过的对象,必得在该目的释放前收回注册。否则,当相应的通知再一次现身时,公告中央依旧会向该监听器发送新闻。因为相应的监听器对象已经被释放了,所以大概会变成应用崩溃
- dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self];}
  • 实践各类:必要求先向通告中央登记通告监听器,相当于何人要监听什么人发布的消息,然后再执行发表消息,不然会促成音信发出来了没人接纳的场馆

公告的利用方法二:

使用Block的方法监听通知:- (id <NSObject>)addObserverForName:(nullableNSString *)name object:(nullableid)obj queue:(nullableNSOperationQueue *)queue usingBlock:(NSNotification *note))block NS_AVAILABLE(10_6, 4_0);@interface ViewController ()@property (nonatomic, weak) id observe;@end- test2 {//监听通知方式二: //1.监听通知 /** * 监听通知 * * Name:通知名称 object:谁发出的通知 queue:队列(决定block在哪个线程中区执行,传入nil:在发布通知的线程中去执行,也就是发布通知在哪个线程,block就在哪个线程中区执行) usingBlock:监听到通知的block回调 注意:一定要移除 */ _observe = [[NSNotificationCenter defaultCenter] addObserverForName:@"name" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { //只要监听到通知 就会调用 NSLog(@"%@",[NSThread currentThread]); }]; //2.发送通知 /** * Name:通知名字 object:谁发出的通知 */ [[NSNotificationCenter defaultCenter] postNotificationName:@"note" object:nil]; }//方式二:移除通知- dealloc { [[NSNotificationCenterdefaultCenter] removeObserver:_observe];}

布告机制(概念),通告机制概念

一、通告宗旨(NSNotificationCenterState of Qatar

      通告中央是贰个单例类,通过下句代码创设。

[NSNotificationCenter defaultCenter];

二、通知(NSNotification)

// 一个完整的通知一般包含3个属性:
- (NSString *)name; // 通知的名称
- (id)object; // 通知发布者(是谁要发布通知)
- (NSDictionary *)userInfo; // 一些额外的信息(通知发布者传递给通知接收者的信息内容)

// 初始化一个通知(NSNotification)对象
- (instancetype)initWithName:(NSString *)name object:(id)object userInfo:(NSDictionary *)userInfo;
  (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;
  (instancetype)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;

三、公布通报

      能够由此文告中央的单例对象,来调用相应的措施,发出通报。

- (void)postNotification:(NSNotification *)notification; // 发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等
- (void)postNotificationName:(NSString *)aName object:(id)anObject; // 发布一个名称为aName的通知,anObject为这个通知的发布者
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo; // 发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息

四、选取公告

      此处富含多个内容,一是挂号文告监听器,另叁个是吊销注册文告监听器。因为,公告中央不会保留(只怕说retain或许说强引用)监听器对象,由此在通报宗旨注册过的对象,必得在该对象释放前收回注册。不然,当相应的通报再度现身时,通告大旨依然会向该监听器发送音信。因为相应的监听器对象已经被假释了,所以只怕会导致应用崩溃。

      1、能够透过公告大旨的单例对象,来调用相应的艺术,注册布告监听器

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
// observer:监听器,即谁要接收这个通知
// aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入
// aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知,即能收到所有的通知
// anObject:通知发布者。如果为anObject和aName都为nil,监听器能收到所有的通知
- (id <NSObject>)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block;
// name:通知的名称
// obj:通知发布者
// block:收到对应的通知时,会回调这个block
// queue:决定了block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行

      2、能够因此通告大旨的单例对象,来调用相应的办法,撤废注册通告监听器

- (void)removeObserver:(id)observer;
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

// 一般在监听器销毁之前取消注册(如在监听器中加入下列代码):
- (void)dealloc {
    //[super dealloc];  非ARC中需要调用此句
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

五、公告注意点

      平日观察者方式的频率不是非常高,文告大旨的属性照旧特别好的。

      1、监听要登记,对象销毁时,要收回注册。

      2、对于部分质量消耗比极大的效果与利益,比方:地图定位,蓝牙( Bluetooth® 卡塔尔(قطر‎通信,加快器。能够视图将现出时登记监听,视图就要消失时,撤消注册监听。

      3、布告是同台的,只要发送了音讯之后,会先实践监听方法,监听方法推行到位之后,才会实行后续的代码!假设监听方法中操作耗时,能够开启线程试行。

      4、通知和代办的抉择

           首先叁个协同点,两个都得以产生目的之间的通讯和信息传送。其次,布告能够是多对多的涉及,可是代理只是一定的关联。

六、补充内容

     1、UIDevice通知

         UIDevice类也是提供了三个单例对象,它表示着器具,通过它能够取得部分装置相关的音信,比方电池电量值(batteryLevel卡塔尔国、电瓶状态(batteryState卡塔尔、设备的品类(model,比如iPod、One plus等卡塔尔国、设备的系统(systemVersion卡塔尔。

         通过[UIDevice currentDevice]能够拿走这一个单例对象。

         UIDevice对象会不间断地公布部遍及告,下列是UIDevice对象所揭穿通报的名号常量:

UIDeviceOrientationDidChangeNotification // 设备旋转
UIDeviceBatteryStateDidChangeNotification // 电池状态改变
UIDeviceBatteryLevelDidChangeNotification // 电池电量改变
UIDeviceProximityStateDidChangeNotification // 近距离传感器(比如设备贴近了使用者的脸部)

     2、键盘布告

        大家通常索要在键盘弹出只怕隐蔽的时候做一些特定的操作,因而必要监听键盘的情况。键盘状态改换的时候,系统会产生一些特定的通知。

UIKeyboardWillShowNotification // 键盘即将显示
UIKeyboardDidShowNotification // 键盘显示完毕
UIKeyboardWillHideNotification // 键盘即将隐藏
UIKeyboardDidHideNotification // 键盘隐藏完毕
UIKeyboardWillChangeFrameNotification // 键盘的位置尺寸即将发生改变
UIKeyboardDidChangeFrameNotification // 键盘的位置尺寸改变完毕

        系统一发布生键盘通知时,会顺手一下跟键盘有关的附加音讯(词典卡塔尔(قطر‎,词典听而不闻的key如下:

UIKeyboardFrameBeginUserInfoKey // 键盘刚开始的frame
UIKeyboardFrameEndUserInfoKey // 键盘最终的frame(动画执行完毕后)
UIKeyboardAnimationDurationUserInfoKey // 键盘动画的时间
UIKeyboardAnimationCurveUserInfoKey // 键盘动画的执行节奏(快慢)

一、公告中央(NSNotificationCenter卡塔尔国通告宗旨是四个单例类,通过下句代码创制。 [NSNotificationCenter defaultCen...

二、布告在异步线程中的使用

本文由澳门威利斯人发布于办公软件,转载请注明出处:异步发送和接收通知,通知机制概念

关键词: 澳门威利斯人 IOS 详解 通知