Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

7.3 Key Value Observing

Koya Tamura edited this page May 12, 2013 · 8 revisions

Introduction to Key-Value Observing Programming Guide

キー値監視プログラミ ングガイド

NSKeyValueObserving Protocol Reference

2オブジェクト間で、一方のオブジェクトでイベントが発生したときにもう一方のオブジェクトにメッセージを送る方法は大きく分けて三つあります。

パターン 特徴
delegate パターン (1.4 参照) あるオブジェクトの処理を他のオブジェクトに委譲。一対一の関係
Key Value Observing あるオブジェクトのプロパティの値を監視を登録し、そのプロパティの値に変化があった場合に通知を監視登録したオブジェクトは通知を受け取ることができる。
NSNotification、NSNotificationCenter を用いた通知 NSNotificationCenter という仲介オブジェクトを介して、あるオブジェクトから通知登録しているあらゆるオブジェクトに通知することができる

この章では KVO について解説します。下図は KVO の略図です。 KVO

KVO の概要

KVO を実現するためには以下のステップが必要です

  1. 監視したいオブジェクトのキー値に対して監視登録をおこなう
  2. 監視対象に変化が起きたときの通知ハンドラーの実装
  3. 監視登録の解除

1. キー値の監視登録

まず監視したい counter object を監視登録してみましょう。

[_counter addObserver:self  // [1] 監視者
           forKeyPath:@"count" // [2] 監視対象のキー値
              options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) // [3] オプションの指定
              context:nil]; //[4] 任意のオブジェクトを指定

[1] 監視者

監視するオブジェクトを指定します。指定したオブジェクトに変化通知が届きます。

[2] 監視対象のキー値

監視したいオブジェクトのどのプロパティの変化を監視するかを指定します。

[3] オプションの指定

オプションを指定することで通知の際に取得できる値が変わってきます。 NSKeyValueObservingOptions

[4] 任意のオブジェクトを指定

任意のオブジェクトを指定することで、通知を受け取ったときにそのオブジェクトにアクセスすることができます。

2. 通知ハンドラーの実装

observer になったオブジェクトは、監視対象に変化があった場合このメソッドが呼び出されます。

-(void)observeValueForKeyPath:(NSString *)keyPath
                     ofObject:(id)object
                       change:(NSDictionary *)change
                      context:(void *)context
{
    NSLog(@"%@", change);
}

例えば、監視対象の count の値がインクリメントされた場合以下のようなログがはかれます。

console log

MixiKVOSample[52446:c07] {
    kind = 1;
    new = 1;
    old = 0;
}

3. 監視登録の解除

例えば、監視者オブジェクトが破棄された時など監視する必要がなくなった場合は監視解除を行う必要があります。

-(void)dealloc
{
    [_counter removeObserver:self forKeyPath:@"count"];
}

問題

下図の仕様を満たすように KVO を用いて実装してください。

practice

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally