1

試行中に待機ページを表示するログイン ページを作成しようとしています。メインスレッドでUIActivityIndicatorView実行され、接続を行う別のスレッドがあります。コメントを外すとコードは正常に動作しますNSLogが、コメントアウトすると実行され続けます。ないときに while ループが存在しない理由を誰かに説明できますNSLogか? 少し複雑です。コマンドを準備し、正常に接続されたwebsocket場合にのみコマンドを起動するコントロール クラスがあります。websocket

アクション フローは次のようになります。

LoginButtonクリック -> rootView通話[_spinner startAnimating];-> 接続試行 -> 接続websocketに成功したらログイン コマンドを送信します。

rootViewスピナーをアニメーション化し、応答を待つ必要があります。

  [_spinner startAnimating];
  [NSThread detachNewThreadSelector:@selector(attampingWS) toTarget:self withObject:nil];


  - (void) attampingWS {
     while ([connection isAttamptingWS] && ![connection isConnectedToWebSocket]) {
        /** waiting until it's done **/
        //      NSLog(@"?");
     }
     if ([connection isConnectedToWebSocket]) {
           [self proceedLogin];
           [_spinner performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:NO];
     }
  }

接続クラス:

  @property(nonatomic) NSTimer *attampConnectionTimeOut;
  @property(nonatomic) NSTimer *attampConnection;
  @property BOOL isConnectedToWebSocket;

  - (BOOL) isAttamptingWS {
     return [_attampConnection isValid];
  }

  - (BOOL) isWaitingForResponse {
     return [_waitingForResponse isValid];
  }
  /** this method is redirected from websocket by using delegation **/ 
  - (void)dbConnectionDidConnected:(websocket *)connection {
     [self _terminateAttamptingConnection];
     [self setIsConnectedToWebSocket:TRUE];
  }
4

2 に答える 2

0

スレッド間の同期に空のループを使用しないでください。ループが終了しないことがわかっているため、多くの CPU 時間を浪費し、さらに重要なことです。コンパイラがコードを最適化し、[connection isAttamptingWS] の正しい結果が得られないためです。

しかし、この正確な問題を解決するには (なぜこれが起こるのかを確認するため) 、isAttamptingWS の戻り値にvolatileキーワードを追加できると思います。

于 2013-09-10T05:39:00.367 に答える