2009-06-28 2 views
0

私のiPhoneアプリケーションからサーバーに接続するためにAsyncSocketを使用しています。さて、これをNSNotification AsyncSocketと組み合わせて使用​​したときの奇妙さ

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(peerStatusDidChange:) name:@"PEERSTATUSCHANGED" object:nil]; 
    } 
    return self; 
} 


- (void)peerStatusDidChange:(NSNotification *)notification { 
    NSLog(@"NOTIFICATION RECEIVED"); 
} 

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData*)data withTag:(long)tag { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"PEERSTATUSCHANGED" object:self]; 
    [sock readDataToData:[AsyncSocket CRLFData] withTimeout:-1 tag:0]; 
} 

とのViewController上:サーバからデータを受け取ったデリゲートでは、私はのtableViewのreloadDataをトリガするためのtableViewのデリゲートを言うだろう通知を投稿しますまったく動作しません。通知はポーズされていますが、ViewControllerによって認識されません。しかし、私がapplicationDidFinishLaunchingで同じことをするとき:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

protocol = [[XBBProtocol alloc] init]; 

SourceListViewController *sourceListVC = [[[SourceListViewController alloc] initWithNibName:@"SourceListViewController" bundle:nil] autorelease]; 
UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:sourceListVC] autorelease]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"PEERSTATUSCHANGED" object:self]; 
[protocol connectToServer]; 

// Override point for customization after application launch 
[window addSubview:[navigationController view]]; 
[window makeKeyAndVisible]; 
} 

私はviewControllerで受け取った通知を受け取りました。

誰でも知っていますか?それは別のスレッドにあるAsyncSocketのデリゲートメソッドと何か関係がありますか?

ありがとうございます。

答えて

1

あなたのinitWithNibName:bundle:メソッドが実際に呼び出されていない可能性があります。ビューコントローラを(コードではなく)NIBでインスタンス化すると、代わりにinitWithCoder:が呼び出されます。

すぐに確認するには、initWithNibName:bundle:にブレークポイントを設定します。

+0

私は、initWithNibName:bundle:メソッドにブレークポイントを設定しましたが、実際に通知登録が実行されました。 また、viewControllerはapplicationDidFinishLaunchingメソッドで通知された通知を受け取りました。 本当に奇妙です。つまり、AsyncSocketはnsnotificationの動作に影響しないはずです。 – Ben

+0

AsyncSocketは通知に影響しません。 onSocketについて:didReadData :?メソッドが呼ばれていると確信していますか?最初の読み取りを開始することはできません。 –

1

通知を送信するメソッドを別のメソッドに配置し、 "performSelectorOnMainThread"で呼び出すようにしてください。あなたのネットワークコードは、バックグラウンドスレッドで呼び出されている可能性が非常に高いので、通知が発生すると、同じスレッドのテーブルビューに通知されます。

メインスレッド以外ではUI呼び出しを行うことはできません。

+1

AsyncSocketは、読み取り/書き込みメソッドが呼び出されたスレッドの実行ループでネットワーク操作をスケジュールします。また、通知は通知されたスレッドで送信されるため、スレッドが明示的にデタッチされない限り、通知メソッドがメインスレッド上で発生しているはずです。 –

+0

しかしreloadDataが呼び出されていて、アプリケーションデリゲートからうまく動作しない場合は、彼がバックグラウンドスレッドを使用していることがほぼ確実です。 –