1. 程式人生 > >Notification通知代碼簡潔使用

Notification通知代碼簡潔使用

arr 異步通知 anim level string 對象 time pre move

1、自定義發送 Notification 的使用

  • 1.1 通知(消息)的創建 ---------------詳細介紹篇

    // 不帶消息內容
    NSNotification *notification1 = [NSNotification notificationWithName:@"notification1"
                                                                  object:self];
    // 帶消息內容
    NSNotification *notification2 = [NSNotification notificationWithName:@"notification2"
                                                                  object:self
                                                                userInfo:@{@"name":_name, @"age":_age}];
  • 1.2 發送通知

    // 發送創建好的消息
    [[NSNotificationCenter defaultCenter] postNotification:notification1];
    
    // 直接發送消息,不帶消息內容
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notification3"
                                                        object:self];
    // 直接發送消息,帶消息內容
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notification4"
                                                        object:self
                                                      userInfo:@{@"name":_name, @"age":_age}];
  • 1.3 註冊通知(觀察者)

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(notification1Sel)
                                                 name:@"notification1"
                                               object:nil];
    // 通知觸發方法,通知無內容
    - (void)notification1Sel {
    }
    
    ----------------------------------------------------------------------------
    
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(notification2Sel:)
                                                 name:@"notification2"
                                               object:nil];
    
    // 通知觸發方法,通知有內容
    - (void)notification2Sel:(NSNotification *)notification {
        // 接收用戶消息內容
        NSDictionary *userInfo = notification.userInfo;
    }
  • 1.4 移除通知(觀察者)

    // 移除此觀察者的所有通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // 移除指定名字的通知
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"notification1" object:nil];

2、異步發送 Notification 的使用

  • 2.1 發送異步通知

      - (void)enqueueNotification:(NSNotification *)notification
                     postingStyle:(NSPostingStyle)postingStyle;
    
      - (void)enqueueNotification:(NSNotification *)notification
                     postingStyle:(NSPostingStyle)postingStyle
                     coalesceMask:(NSNotificationCoalescing)coalesceMask
                         forModes:(nullable NSArray<NSString *> *)modes;
      參數說明:
          notification:通知
          postingStyle:發布方式
          coalesceMask:合並方式
          modes       :運行循環模式,nil 表示 NSDefaultRunLoopMode
          NSPostingStyle                              :發布方式
              NSPostWhenIdle = 1,                     :空閑時發布
              NSPostASAP = 2,                         :盡快發布
              NSPostNow = 3                           :立即發布
          NSNotificationCoalescing                    :合並方式
              NSNotificationNoCoalescing = 0,         :不合並
              NSNotificationCoalescingOnName = 1,     :按名稱合並
              NSNotificationCoalescingOnSender = 2    :按發布者合並
    
      // 創建通知
      NSNotification *asyncNotification = [NSNotification notificationWithName:@"asyncNotification" object:self];
      dispatch_async(dispatch_get_global_queue(0, 0), ^{
          // 將通知添加到發送隊列中,發送通知
          [[NSNotificationQueue defaultQueue] enqueueNotification:asyncNotification postingStyle:NSPostWhenIdle];
      });
  • 2.2 移除異步通知

    - (void)dequeueNotificationsMatching:(NSNotification *)notification coalesceMask:(NSUInteger)coalesceMask;
    參數說明:
        notification:通知
        coalesceMask:合並方式
    
    // 移除通知,不是立即發布的通知可以被移除
    [[NSNotificationQueue defaultQueue] dequeueNotificationsMatching:asyncNotification coalesceMask:0];

3、系統通知的使用

  • 3.1 UIDevice 通知

    • UIDevice 對象會不間斷地發布一些通知,下列是 UIDevice 對象所發布通知的名稱常量:
    UIDeviceOrientationDidChangeNotification     // 設備旋轉
    UIDeviceBatteryStateDidChangeNotification    // 電池狀態改變
    UIDeviceBatteryLevelDidChangeNotification    // 電池電量改變
    UIDeviceProximityStateDidChangeNotification  // 近距離傳感器(比如設備貼近了使用者的臉部)
  • 3.2 鍵盤通知

    • 鍵盤狀態改變的時候,系統會發出一些特定的通知:
    UIKeyboardWillShowNotification         // 鍵盤即將顯示
    UIKeyboardDidShowNotification          // 鍵盤顯示完畢
    UIKeyboardWillHideNotification         // 鍵盤即將隱藏
    UIKeyboardDidHideNotification          // 鍵盤隱藏完畢
    UIKeyboardWillChangeFrameNotification  // 鍵盤的位置尺寸即將發生改變
    UIKeyboardDidChangeFrameNotification   // 鍵盤的位置尺寸改變完畢
    • 系統發出鍵盤通知時,會附帶一下跟鍵盤有關的額外信息(字典),字典常見的 key 如下:
    UIKeyboardFrameBeginUserInfoKey         // 鍵盤剛開始的 frame
    UIKeyboardFrameEndUserInfoKey           // 鍵盤最終的 frame(動畫執行完畢後)
    UIKeyboardAnimationDurationUserInfoKey  // 鍵盤動畫的時間
    UIKeyboardAnimationCurveUserInfoKey     // 鍵盤動畫的執行節奏(快慢)
  • 3.3系統發送 Notification 的使用

    • 一般在監聽器銷毀之前取消註冊(如在監聽器中加入下列代碼):
    - (void)dealloc {
        // [super dealloc];  // 非 ARC 中需要調用此句
        [[NSNotificationCenter defaultCenter] removeObserver:self];
    }
    • 在註冊、移除通知時,通知名稱標示(aName)使用系統定義的標示。
    • 註冊通知(觀察者)
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(playFinished)
                                                 name:AVPlayerItemDidPlayToEndTimeNotification
                                               object:nil];
    • 移除通知(觀察者)
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:AVPlayerItemDidPlayToEndTimeNotification
                                                  object:nil];

Notification通知代碼簡潔使用