【问题标题】:Run-loops and threads in Apple's CocoaXMLParser exampleApple 的 CocoaXMLParser 示例中的运行循环和线程
【发布时间】:2009-11-21 13:27:30
【问题描述】:

Apple 的 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请求生成的线程不会自动创建和销毁吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,你是说线程(在本例中为 NSURLConnection)可以在调用 connectionDidFinishLoading 方法之前终止吗?
    • 没错,事实上我在现实生活中遇到过这个确切的问题——你打开一个有效的连接,然后connectionDidFinishLoading 永远不会被调用......也没有像didReceiveData 这样的其他方法。在这种情况下,您尝试加载的后台线程在 URL 连接甚至可以做任何事情之前就终止了。
    猜你喜欢
    • 2023-03-06
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多