iOS鍵-值初探

鍵-值編碼 KVC

  • setValue:forKey:通過名稱(字符串)設置任何屬性的值,字符串可在運行時修改
    • [aObject setValue:theValue forKey:theKey]
  • valueForKey:從對象中獲取屬性的值
    • NSString *aString = [aObject valueForKey:theKey]
  • 其實與gettersetter一樣,但更加靈活

鍵-值觀察 Key-Value Observing, KVO

  • 控制器獲知何時更新視圖
    1. 反復檢查模型觀察是否有任何更改
      • 創建計時器,定期從模型中獲取最新值,并提供給視圖
      • 浪費資源:時間,CPU,電池
    2. 等待模型向控制器通知變化
  • 允許對象注冊為 當另一個對象 更改它的一個屬性的值時收到通知
  • 注冊更改通知
    • 告訴對象要觀察的三件事

      1. 當屬性修改時,需要被通知的對象(觀察者)
      2. 被觀察者的屬性名稱
      3. 當一個變化發生時,觀察者應該被告知的信息
      4. [optional]包含一個指針或引用,當屬性值發生變化時,指針或對象引用應該被傳遞到運行的方法中
    • 注冊通知

      [aProduct addObserver:self
                  forKeyPath:@"productName"
                       options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
                       context:nil];
      
    • 當一個對象被注冊為另一個對象的一個觀察者時,該對象(如:觀察者)將接收observeValueForKeyPath:ofObject:change:context:消息

      • 屬性發生變化的對象
      • 發生變化的屬性對象
      • 一個包含變化信息的NSDictionary
      • 當此消息被調用時,context變量將傳遞進去
         - (void)observeValueForKeyPath:(NSString *)keyPath
      ofObject:(id)object
      change:(NSDictionary *)change
      context:(void *)context
      {
          if([keyPath isEqualToString:@"productName"])
          {
              NSString *newName = [change objectForKey:NSKeyValueChangeNew];
              
              ...
              //通知響相應視圖根據newName變量的值進行更新
          }
      }
      
      • NSDictionary包含不同的信息和其他鍵
      • NSKeyValueObservingOptionNew 屬性要被設置的值
      • NSKeyValueObservingOptionOld 屬性之前的值
    • 將變化通知給觀察者

      • 使用了Objective-C的屬性@property,當setter被調用時,Cocoa自動通知任何已注冊的觀察者

      • 不使用屬性,或重寫了setter,需要手動通知系統

        • self對象調用willChangeValueForKeydidChangeValueForKey,跟蹤新值,舊值
        • 重寫setter,同時允許KVO工作
           - (void) setProductName:(NSString *)newProductName
        {
            [self willchangeValueForKey:@"productName"];
            productName = newProductName;
            [self didChangeValueForKey:@"productName"];
        }
        

使用NSNotification進行通知

  • 某些相關聯的事情發生,使用廣播通知
    • 按下Home鍵
  • NSNotification對注冊對象發送廣播通知,由NSNotificationCenter管理,是單例對象
  • 相應Home鍵按下
    • 注冊通知

      [[NSNotificationCenter defaultCenter] addObserver:self
      selector:@selector(applicationEnteredBackground:)
      UIApplicationDidEnterBackgroundNotification object:nil];
      
    • UIApplicationDidEnterBackgroundNotification傳遞出去,注冊的對象將運行applicationenteredBackground:方法,此方法定義在該對象所屬類中

      - (void)applicationEnteredBackground:(NSNotification *)notification
      {
          //進入后臺,進行處理
      }
      
    
    - 不希望接收到消息
    
    
    [[NSNotificationCenter defaultCenter] removeObserver:self]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 來自網絡 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經到供過于求了。今年,找過工作人可能會更深刻地體會...
    用心在飛閱讀 846評論 5 4
  • 一,前言 Objective-C 中的鍵(key)-值(value)觀察(KVO)并不是什么新鮮事物,它來源于設計...
    隨風飄蕩的小逗逼閱讀 475評論 0 0
  • 轉自 iOS 面試常見問題最全梳理 序言 目前形勢,參加到iOS隊伍的人是越來越多,甚至已經到供過于求了。今年,找...
    ZMJun閱讀 809評論 0 11
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,210評論 30 471
  • 眼前的黑 穿過薄霧 還能窺見 一絲絲曙光 路標若隱若現 行色匆匆 路人見了也好奇 這怪人要去哪兒 擺擺手連衣袖也搖...
    叫我梅芳就好閱讀 156評論 0 1