2012-02-27 96 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]運行]運行循環(作爲代碼註釋),然後一切都很好。我不知道爲什麼。有人可以給我一些解釋嗎?謝謝!

回答

1

runloop是一個大事件處理程序無限循環(好吧,直到它停止爲止)。它觀察各種來源,當它們產生事件時,它將這些事件分派給聽衆。這是在單個線程上管理異步操作的一種非常有效的方法。

NSURLConnection(和可可中的許多其他東西)依靠runloop進行處理。如果沒有運行runloop,那麼事件不會被處理。

+0

謝謝!我想知道是否有其他方法可以替代使用runloop? – 2012-02-28 00:22:07

+0

對於命令行應用程序,可以使用'+ sendSynchronousRequest:returningResponse:error:',它是同步的(阻塞直到完成),因此不需要runloop。 – 2012-02-28 02:23:55

+0

謝謝你的幫助,鮑勃。 – 2012-02-28 07:02:06

相關問題