2009-11-21 27 views
0

在CocoaXMLParser类苹果CocoaXMLParser例如,出现以下代码:运行循环和线程在苹果的CocoaXMLParser例如

rssConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 
[self performSelectorOnMainThread:@selector(downloadStarted) withObject:nil waitUntilDone:NO]; 
if (rssConnection != nil) { 
    do { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } while (!done); 
} 

按照NSRunLoop文档“在一般情况下,你的应用程序并不需要或者创建或者显式管理NSRunLoop对象,每个NSThread对象(包括应用程序的主线程)都有一个NSRunLoop对象,根据需要自动为它创建。在此情况下,为什么在此示例中显式管理运行循环?它是否不会由NSURLConnection请求生成的线程自动创建和销毁?

回答

2

在该代码中,运行循环基本上被告知永远运行,以便该线程可以继续处理来自NSURLConnection的传入背景数据。即使为您创建了运行循环,默认情况下,该线程在该方法结束时会终止。

一般来说,当做这样的事情时,将所有内容放入NSOperation然后放入NSOperationQueue会更容易(尽管如果要实现NSUrlConnection回调,您必须在NSOperation类中提供一些额外的方法)。

+0

谢谢,你是说,在调用connectionDidFinishLoading方法之前,线程(在本例中为NSURLConnection)可能会终止? – RunLoop 2009-11-21 18:15:36

+0

的确,事实上我在现实生活中碰到过这个确切的问题 - 你打开一个有效的连接,然后connectionDidFinishLoading永远不会被调用......也不是像didReceiveData这样的其他方法。在这种情况下,您尝试加载的后台线程在URL连接之前终止甚至可以执行任何操作。 – 2009-11-22 04:54:35