0

しばらくの間 iOS を使用していましたが、現在は次のことを必要とする複雑なクライアント サーバー アプリで作業しています。

  • (AFHttpRequestOperation を使用して) サーバーに要求を送信します。応答は間隔または辞書のいずれかです。

  • 間隔がある場合は、(間隔) 秒待機し、サーバーを再度呼び出す必要があります (待機/スリープ?)

  • これは、期限切れのメッセージを受信するか、ユーザーがキャンセルするか、辞書 (上記のとおり) を受信するまで続きます。

  • 辞書を受信した場合は、表示された情報に対してユーザーがアクションを実行するまで、サーバーへの呼び出しを一時停止する必要があります。

  • ユーザーの決定に基づいて、辞書を受信するまで、または有効期限が切れるまで (ユーザーが情報を拒否した場合)、またはユーザーが同意した場合は、質問を停止して情報をさらに処理するまで、呼び出し、待機、呼び出しなどを再開して続行する必要があります。 (しかし、サーブをコールし続けることはありません)

iOS でスレッド化するのは初めてなので、最善のアプローチは何ですか :? 私はdispatch_asynch + performSelector:onThread:withObjectで作業してきましたが、あらゆる種類の問題が発生しています!

質問: AFHttpRequestOperation を内部的に使用する NSOpertation サブクラスで一時停止、キャンセル、待機、スリープを実現するための最良のアプローチ/アプローチは何ですか?

私は、特に iOS でのスレッディングの新人なので、あなたの助けは大歓迎です!!!!

4

1 に答える 1

1

    ネットワーキングでスレッド化を使用しないことをお勧めします。十分に明確ではないように見えますが、非同期ネットワーク リクエストを実装すると、CPU 時間が大幅に短縮されます。
  多くの人がこれを実行しようとして、非同期ネットワーク呼び出しのデリゲート メソッドが呼び出されないという結果に終わります。ネットワーク呼び出しがバックグラウンド スレッドで実行される場合、デリゲートが呼び出しを完了する前にスレッドが終了する可能性があります。
  非同期呼び出しは、キャンセル/一時停止メソッドを呼び出すだけでキャンセルできます。
  メイン スレッドが非常に遅いと感じた場合は、解析や CameraView の呼び出しなど、負荷の高い操作を避けるようにしてください。
  これを行う方法をテストするためだけに NSrunLoop を使用しましたが、あまり利点はありません
 

 -(void)start
{
  [self willChangeValueForKey:@"isExecuting"];
  _isExecuting = YES;
  [self didChangeValueForKey:@"isExecuting"];
  NSURL* url = [[NSURL alloc] initWithString:@"http:your url"];
  NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30];
  connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; // ivar
  [request release];
  [url release];

 // Via the run loop 
  NSPort* port = [NSPort port];
  NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 
  [runLoop addPort:port forMode:NSDefaultRunLoopMode];
  [connection scheduleInRunLoop: runLoop forMode:NSDefaultRunLoopMode];
  [connection start];
  [runLoop run];
}

ネイティブ API をライブラリのものに置き換えることができます。これが何らかの形で役立つことを願っています。

于 2014-05-30T16:49:02.937 に答える