タイトル | 鶴薗賢吾のCocoaはやっぱり!出張版》7. UNIXコマンドの実行(4) | カテゴリー | Cocoa, 鶴薗賢吾のCocoaはやっぱり!出張版 |
作成日 | 2002/1/22 1:58:18 | 作成者 | 新居雅行 |
Cocoaのフレームワークには、通知 ( Notification ) の仕組みがあります。「 こういうことが起きたらここに通知してほしい 」ということを通知センター ( NSNotificationCenter ) に知らせておくと、通知が発生した時点で、指定のインスタンスの指定のメソッドを呼んでくれます。そのメソッドには通知情報 ( NSNotification ) が送られますので、その中身を見ると、通知の種類や通知に附随するデータなどを取得することができます。 この通知というのは、単なるコールバックの仕組みではありません。あるオブジェクトが通知センターに通知を登録したら、その通知を待っている全てのオブジェクト対して通知が送られるのです。この通知を待っているオブジェクトのことをオブザーバ ( Observer ) と呼びます。 ◇通知の概念図 ファイルハンドルは、読み出せるデータがあるときに通知をする機能がありますので、TaskWrapperは、その通知を受け取れるように通知センターにオブザーバ登録を行います。それを行っているのが以下です。
通知センターのインスタンスは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メソッドを実行しておきます。
★ NSFileHandle : バックグラウンドでの読み出しと通知の指定 [書式] - (void) readInBackgroundAndNotify [備考] NSFileHandleから通知を受けるためには、このメソッドを 予め実行しておく必要がある。 (この項続く) [鶴薗賢吾] | |
関連リンク | Cocoaはやっぱり! |