2009-06-03 6 views
2

私が作業しているiphoneアプリケーションでは、カスタムクラスを使用してホストとのネットワーク通信を管理します。 protocolClassというクラスは、appDelegateのivarであり、applicationDidFinishLaunching:メソッドのalloc + initです。appDelegateからUINavigationcontrollerのビューコントローラの1つに情報を渡す方法

ここで、protocolClassはホストからデータを受信するたびに、デリゲートのprotocolClassDidReceiveData:メソッド(appDelegateとして設定)を呼び出します。 UINavigatorController内のcustomViewControllerの1つでデータを更新する必要があります。

私はappDelegateで更新する必要があるcustomViewControllerへの参照を追加してください。または他のより効率的な方法がありますか?

もし私がcustomViewcontrollerへの参照を保持していたら、どのようなメモリ使用の影響がありますか?

ありがとうございます。

答えて

2

私はあなたが正しいと思えば、あなたのプログラムの無関係な部分でイベントが発生した後で、ビューを更新したいと思う。

コードの依存関係の数を減らすには、より緊密に結合されたインスタンス変数の代わりにNSNotificationを使用することをお勧めします。通知はココアのコンセプトで、コードの一部で任意の数のリスナーが登録できるイベント様のメッセージを発信できます。あなたのケースでは

それは次のようになります。

AppDelegateヘッダー:

extern NSString* kDataReceived; 

AppDelegateの実装:いくつかの興味を持ったリスナークラスの実装で

NSString* kDataReceived = @"DataReceived"; 

- (void)protocolClassDidReceiveData:(NSData*)data { 
    [[NSNotificationCenter defaultCenter] postNotificationName:kDataReceived 
                 object:self 
                 userInfo:data]; 
} 

(例えば、あなたのUIViewController) :

// register for the notification somewhere 
- (id)init 
{ 
    self = [super init]; 
    if (self != nil) { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(dataReceivedNotification:) 
                name:kDataReceived 
                object:nil]; 
    } 
} 

// unregister 
- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

// receive the notification 
- (void)dataReceivedNotification:(NSNotification*)notification 
{ 
    NSData* data = [notification userInfo]; 
    // do something with data 
} 
+0

ニコライさん、ありがとうございます。最初は、不要なシステム・リソースを使い果たすことを意味するnotificationCenterの使用について心配していました。 – Ben

+0

私はそれが早すぎる最適化だったと思います。どのように多くの通知がすべてのビューから飛び回っているかを見ると、ソケットからデータを受け取った後に通知を送信することは何の害もないと思います。 –

+0

ありがとうNikolai!私はイベントをグーグルで過ごしていて、あなたのポストを見ました – ambertch

2

はい、通知はそれを行う良い方法です。そして、モデルがコントローラを更新したいとき、 ViewController] - 通知はそれを行う良い方法です。私の場合は、SSDP(AsyncUdpSocketを使用)を使用してデバイスを検出しようとしていますが、デバイスを検出したときにView Controllerを更新/通知したかったのです。これは非同期なので、データを受け取ったときに通知を使用しました。

(私はINITをオーバーライドしようとしたが、それは私のためにうまく動作しませんでした)のviewDidLoadで - 次のように私は、通知のための私のViewControllerを登録:ここで私がやったシンプルなものがある

*NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self 
      selector:@selector(foundController:) 
       name:@"DiscoveredController" 
      object:nil]; 

ここにあります私のViewControllerのセレクタ:私の「モデル」[未アプリの委任で

// receive the notification 
- (void)foundController:(NSNotification *)note 
{ 
    self.controllerFoundStatus.text = @"We found a controller"; 
} 

- 次のように私は私がデバイスを検出するために使用する新しいクラスを作成している「serviceSSDPは、」私がしたすべての通知を投稿することでした:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DiscoveredController" object:nil]; 

これだけです。AsyncUdpSocketの

- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock 
    didReceiveData:(NSData *)data 
      withTag:(long)tag 
      fromHost:(NSString *)host 
       port:(UInt16)port 

:通知のこの投稿は、私が[特別で、私のSSDP発見への正しい応答を得るときです。

関連する問題