学习内容

NSNitification与NotificationCenter(通知与通知中央)

  1. 通知的使用

    • [[NSNotificationCenter defaultCenter]addObserver:selfselector:@selector
       (noticeAction:) name:@"name" object:nil];
      

      注册观察者

    • NSNotification* notice = [NSNotification notificationWithName:@"name" object:nil userInfo:params];
      [[NSNotificationCenter defaultCenter]postNotification:notice];
      

      建立一个通知并发送

    • 观察者工具的注册一定要比通知的发送提前,否则的话会吸收不到通知

  2. 通知和delegate的基本区别

    • 通知是允许多对多的,而delegate只能是一对一的
    • 通知的耦合度较低,发送方不需要知道通知方的任何情况,而delegate不行
    • 通知的效率比起delegate略差
  3. 通知是同步照样异步的?

    • postNotification:通知的发送总是会卡住当前线程,守候所有的observer工具执行(若是没有经由特殊处置,吸收者工具的selector与postNotification在统一线程执行)完成后才会继续往下执行,以是是同步的
  4. 通知的移除

    • 在iOS9之前的版本中,若是对一个观察者工具在delloc之前之中没有从通知中央移除(remove)的话,会发生BAD_ACCESS野指针错误,导致crash
    • iOS9.0及以后的版本中不会造成crash
    • 缘故原由:iOS9.0之前NSNotificationCenter持有的是observer的unsafe_uncertain指针,若是观察者工具已经被释放,然则没有从通知中央移除,那么postNotification方式会向观察者已经被接纳的内存发送新闻,就会造成野指针接见错误,iOS9.0以后,系统将unsafe_uncertain指针更改成了weak指针(工具接纳,自动置nil),向nil发送新闻不会差生任何问题(同时这里说明晰oc是可以向nil发送新闻的)
  5. 异步通知

    • [[NSNotificationQueue defaultQueue]enqueueNotification:notice postingStyle:NSPostASAP];
      ----------------------------------------------------------------------------------typedef NS_ENUM(NSUInteger, NSPostingStyle) {
      	//空闲发送通知 当运行循环处于守候或空闲状态时,发送通知,对于不重要的通知可以使用。
        NSPostWhenIdle = 1,
        //尽快发送通知 当前运行循环迭代完成时,通知将会被发送,有点类似没有延迟的定时器。
        NSPostASAP = 2,
        //和postNotification一样是同步通知
        NSPostNow = 3
      };
      
    • 三种枚举类型代表三种发送方式(异步/同步都可)

    • 同样的,异步发送通知的话还可以使用开启一个新的线程的方式

    • dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [[NSNotificationCenter defaultCenter]postNotification:notice];
      });
      
  6. 通知的合并(待完善)

    • [[NSNotificationQueue defaultQueue] enqueueNotification:notice postingStyle:NSPostASAP coalesceMask:NSNotificationNoCoalescing forModes:nil];
      -----------------------------------------------------------------------------------
      typedef NS_OPTIONS(NSUInteger, NSNotificationCoalescing) {
      	  // 不合成
          NSNotificationNoCoalescing = 0,  
        	// 凭据NSNotification的name字段举行合成
          NSNotificationCoalescingOnName = 1,  
        	// 凭据NSNotification的object字段举行合成
          NSNotificationCoalescingOnSender = 2  
      };
      
    • NSNotificationQueue除了有异步通知的能力之外,也能对当前行列的通知凭据NSNotificationCoalescing类型举行合并,需要配合差别的NSRunLoopMode来举行

    • 通过合并通知我们可以用来保证相同的通知只被发送一次

  7. NSNotificationCenter实现原理

    • 通知中央用来治理通知的吸收和发送,一最先将观察者注册到通知中央的通知调度表中,然后发送通知时行使标识符name和object识别出观察者,并挪用响应的观察者方式,即通报新闻(新闻通报机制),若是是基于block建立的通知就挪用NSNitification的block
  8. NSNotificationCenter使用block方式添加的观察者

    • - (id<NSObject>)addObserverForName:(NSString *)name
                                  object:(id)obj
                                   queue:(NSOperationQueue *)queue
                              usingBlock:(void (^)(NSNotification *note))block
      
      
    • addObserver使用一个现存的工具作为观察者(一样平常为self),而使用block方式会建立一个匿名的(id )工具作为观察者,这个匿名工具会在指定的行列上去执行block

    • 若是queue为nil,则新闻是默认在post线程中同步处置,即通知的post与转发是在统一线程中,不为nil的话就会在我们指定的行列中执行

    • 若是一个给定的通知触发了多个观察者的block操作,则这些操作会在各自的Operation Queue中被并发执行。以是我们不能去假设操作的执行会根据添加观察者的顺序来执行

    • 这个方式会返回一个匿名的观察者工具,我们需要手动释放这个工具。

iOS中工具间的五种传值方式(属性、署理、单例、Block、通知)

  1. 属性传值

    • 通过工具的公有属性举行传值
  2. 署理传值

    • 在委托方界说协议,协议中声明@required/@optional方式,声明一个署理属性,使用weak修饰符

    • 在署理方遵守协议,实现协议中的方式

    • 初始化委托工具,将委托工具的署理设置为self(署理工具自身)

    • 查看署理方是否实现了需要执行的选择子(SEL),若是实现了便最先执行

    • if ([self.delegate respondsToSelector:@selector(codeIOS)]) {
        // 让署理方执行协议中的方式
        [self.delegate SEL];
      }
      
    • 署理传值一样平常用于逆向传值,如:A控制器跳转到B控制器,B控制器为委托工具,A控制器为署理工具,B工具的署理为A工具,那么在B工具中可以传值给A工具,并在A工具中执行响应的方式

  3. 单例模式传值

    • 将一个类写成单例(常用dispatch_once),这样这个类就只含有全局唯一的实例,可以向整个程序提供实例
    • 若是一个类建立实例会花费许多资源,那么可以将这个类写成单例类,节约alloc,init的时间
    • 在程序中若是多个类接见统一个变量,那么也可以将将该变量写入单例类中,挪用起来加倍利便
  4. 使用block代码块举行传值

    • 可以用于数据在多个工具间通报,网络请求的回调等

    • //在工具B中block作为方式参数
      - (void)getNextPage:(void (^)(BOOL))completeBlock{
        //block可以嵌套,第一层block可以在最后的block体中举行回调
          [self getPage:self.page complete:^(NSMutableArray *result) {
              if ([result count]) {
                  self.page++;
                  [self.musicList addObjectsFromArray:result];
                  if (completeBlock) {
                    //需要回调时,执行block
                      completeBlock(true);
                  }
              }else{
                  if (completeBlock) {
                      completeBlock(false);
                  }
              }
          }];
      }
      ------------------------------------------------------------------------------
      //在工具A中isSucceed为回调回来的值
        [strongSelf.musicModel getNextPage:^(BOOL isSucceed) {
          if (isSucceed) {
            [strongSelf.waterFallCollectionView reloadData];
          }
        }];
      
  5. 通知传值

    • NSNotification的使用就是通知传值的一些用法
,

申博Sunbet

www.006yb.com是Sunbet公司指定亚洲官方直营现金网,官方授权,老品牌信誉有保障.Sunbet欢迎您加入我们。

Allbet Gaming声明:该文看法仅代表作者自己,与阳光在线无关。转载请注明:济宁红盾信息网:NSNotification,NSNotificationCenter的使用、iOS中五种工具间传值的方式
发布评论

分享到:

联博统计:GU四大稀奇联名系列接力登场,7/6起陆续开卖
2 条回复
  1. UG环球手机版下载
    UG环球手机版下载
    (2020-09-19 00:07:59) 1#

    欧博会员开户欢迎进入欧博会员开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我要常驻啦

  2. UG环球手机版下载
    UG环球手机版下载
    (2020-09-19 00:08:23) 2#

    欧博会员开户欢迎进入欧博会员开户(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。我要常驻啦

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。