2012年8月31日星期五

[iOS]NSURLConnectionのThread問題

NSURLConnectionを利用する場合、Threadの問題を注意する必要がある。
要求によって、http requestに非同期と同期の二つ方式を選択する場合がよくある。

  • 同期
基本はUIThreadに実行される。
UITheadに使う時、connectionWithRequest或はstartを使えば、問題なく送信ができる。
非UIThreadの場合、sendSynchronousRequest或はperformOnMainThread:selector(実はsendSynchronousRequestと同じだと思う)を使う、効果としてはUIThreadに実行していると同じ。

  • 非同期
非同期なので、必ず非UIThreadで実行している。
ここは注意するところ。
一般的に、NSURLConnectionを使用する場合、protocolをimplementする必要がある。なので、そのprotocolに従って定義したmethodを実行するThreadが終了したら、requestも正しく処理できない。異常現象としてはrequestが送信できない、エラーも出ない。これもUIThreadがよく使われる原因だ、UIThreadが終了しないから。
解決策の方法がたくさんあるが、原理は一つだ:何とかして、methodを実行するThreadを死なせないように。例えば、flagを立てってwhile loopを掛ける、或はCFRunLoopRun()とCFRunLoopStopを使うと、処理が完成する。

没有评论:

发表评论