2012-02-27 1 views
0

今、HTTPFileUploadSampleをテストしています。私は、コマンドツールラインプログラムの種類を作成するためにそれを使用したいので、私はmain()関数でメソッドを呼び出すので、このように:main()でNSURLConnectionを使用すると、接続が完了できない理由は何ですか?

int main (int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     Uploader *upl = [Uploader alloc]; 
     [upl initWithURL:[NSURL URLWithString:@"http://localhost/uploader.php"] 
       filePath:@"/test.txt" 
       delegate:upl 
      doneSelector:@selector(onUploadDone) 
      errorSelector:@selector(onUploadError)]; 
      //[[NSRunLoop currentRunLoop] run]; 
    } 
    return 0; 
} 

私は、それが正常に接続し、ポストの要求を作成することができましたデリゲートメソッド(接続:didReceiveResponse:または接続:didReceiveData:またはconnectionDidFinishLoading:)を呼び出さないため、接続を完了できません。 私は[[NSRunLoop currentRunLoop] run]というメソッドを呼び出してコード内のコメントとしてループを実行します。何故かはわからない。誰か私に説明を教えてもらえますか?どうも!

答えて

1

runloopは大きなイベントハンドラの無限ループです(停止するまで無限ループ)。さまざまなソースを監視し、イベントを生成すると、それらのイベントをリスナーに送ります。これは、単一スレッドで非同期操作を管理する非常に効果的な方法です。

NSURLConnection(およびその他の多くのものはココアにあります)は処理のためにランループに依存しています。 runloopを何も実行しないと、イベントは処理されません。

+0

ありがとうございます! runloopの代わりに他の方法があるかどうか知りたいですか? –

+0

コマンドラインアプリケーションの場合、 '+ sendSynchronousRequest:returningResponse:error:'を使うことができます。これは同期(完了までブロックする)なので、runloopは不要です。 –

+0

助けてくれてありがとう、ボブ。 –

関連する問題