タイトル鶴薗賢吾のCocoaはやっぱり!出張版》7. UNIXコマンドの実行(4)カテゴリーCocoa, 鶴薗賢吾のCocoaはやっぱり!出張版
作成日2002/1/22 1:58:18作成者新居雅行
Cocoaのフレームワークには、通知 ( Notification ) の仕組みがあります。「 こういうことが起きたらここに通知してほしい 」ということを通知センター ( NSNotificationCenter ) に知らせておくと、通知が発生した時点で、指定のインスタンスの指定のメソッドを呼んでくれます。そのメソッドには通知情報 ( NSNotification ) が送られますので、その中身を見ると、通知の種類や通知に附随するデータなどを取得することができます。

この通知というのは、単なるコールバックの仕組みではありません。あるオブジェクトが通知センターに通知を登録したら、その通知を待っている全てのオブジェクト対して通知が送られるのです。この通知を待っているオブジェクトのことをオブザーバ ( Observer ) と呼びます。

◇通知の概念図
 

ファイルハンドルは、読み出せるデータがあるときに通知をする機能がありますので、TaskWrapperは、その通知を受け取れるように通知センターにオブザーバ登録を行います。それを行っているのが以下です。

// 標準出力からのデータを受け取るための通知設定
[ [ NSNotificationCenter defaultCenter ]
addObserver : self
selector : @selector(getData:)
name : NSFileHandleReadCompletionNotification
object : [ [ task standardOutput ] fileHandleForReading ] ];

通知センターのインスタンスはdefaultCenterメソッドで得られます。このインスタンスに対して、addObserver : selector : name : object : メソッドを使って、オブザーバを登録します。

 ★ NSNotificationCenter : オブザーバ登録
  [書式] - (void) addObserver : (id ) anObserver
          selector : (SEL ) aSelector
          name : (NSString *) notificationName
          object : (id ) anObject
  [入力] anObserver : 通知先のインスタンス。
     selector : 通知先のインスタンスの実行するメソッド。
     name : 通知してほしい通知の種類。nilにすると全ての通知を受ける。
     object : 通知の発信先の指定。nilにすると全てのインスタンスからの
          通知を受ける。

最初の2つのパラメータがオブザーバの設定で、通知先を自分 ( self ) に、実行するメソッドをgetData : にしています。残りの2つのパラメータは、受け取りたい通知の指定を行っています。nameにNSFileHandleReadCompletionNotification を指定することで、ファイルハンドルからデータが読み出せるようになった時の通知が来ます。objectには、パイプの読み出し用のファイルハンドルを指定していますので、もし、アプリケーションの中にこれ以外のファイルハンドルがあったとしても、そのインスタンスからの通知は届きません。

さて、ここでUNIXのコマンドを起動してから出力結果がどのような流れで通知されるかを簡単な図にしてみましたので、これでイメージを掴んでください。

◇UNIXコマンドの起動と出力の流れ
 

ファイルハンドルは、読み出せるデータがあったとしても、通常は読み出しメソッドが呼ばれるのを待っています。そこで、ファイルハンドルから通知を受けるためには、そのファイルハンドルに通知を出すようにお願いをしておく必要があります。そのためには、readInBackgroundAndNotifyメソッドを実行しておきます。

[ [ [ task standardOutput ] fileHandleForReading ]
readInBackgroundAndNotify ];

 ★ NSFileHandle : バックグラウンドでの読み出しと通知の指定
  [書式] - (void) readInBackgroundAndNotify
  [備考] NSFileHandleから通知を受けるためには、このメソッドを
      予め実行しておく必要がある。
(この項続く)
[鶴薗賢吾]
関連リンクCocoaはやっぱり!