2012-02-27 72 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

相关问题