Objective c (异步)NSURLConnection:what';下面是怎么回事?

Objective c (异步)NSURLConnection:what';下面是怎么回事?,objective-c,cocoa,asynchronous,nsurlconnection,Objective C,Cocoa,Asynchronous,Nsurlconnection,我知道它必须考虑到启动一个线程以发出网络请求,然后可能使用我的委托方法调用performSelectorOnMainThread:的丑陋性 我知道在进行iOS编程时如何使用它,而且它非常有效。但是,我想知道如何在(例如)命令行实用程序的上下文中使其工作,其中没有带有事件处理等的UIApplication 我已经试过了,似乎在调用委托方法之前,异步调用一返回,程序就退出了。我非常想更深入地了解它是如何工作的。委托方法调用安排在启动连接的线程的runloop上。所以它不一定是主线。您可以从任何线程执

我知道它必须考虑到启动一个线程以发出网络请求,然后可能使用我的委托方法调用
performSelectorOnMainThread:
的丑陋性

我知道在进行iOS编程时如何使用它,而且它非常有效。但是,我想知道如何在(例如)命令行实用程序的上下文中使其工作,其中没有带有事件处理等的UIApplication


我已经试过了,似乎在调用委托方法之前,异步调用一返回,程序就退出了。我非常想更深入地了解它是如何工作的。

委托方法调用安排在启动连接的线程的runloop上。所以它不一定是主线。您可以从任何线程执行此操作。但您必须有一个运行时间足够长的运行循环来处理这些委托消息

默认情况下,运行循环必须在默认模式下运行,才能触发这些委托方法。因此,这就是为什么,例如,默认情况下,如果从主线程启动异步连接,当用户滚动tableview或类似内容时,委托方法将不会激发

但是,您可以通过使用-[NSURLConnection scheduleinrunlop:forMode:]在您想要的任何其他运行循环和/或任何运行循环模式上调度委托回调来改变这一点

我希望这就是您要问的?

根据,连接的委托方法在启动连接的同一线程上被调用。因此,要保持线程运行,直到连接有时间完成任务:

int main(int argc, char *argv[])
{   
    // ...
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:del startImmediately:YES];
    CFRunLoopRun();    // Run this run loop, run!
    // ...
}
然后,当连接表示已完成时,代理可以停止运行循环:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // This returns control to wherever you called
    // CFRunLoopRun() from, so you can still clean up
    // or do other interesting things.
    CFRunLoopStop(CFRunLoopGetCurrent());
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Error: %@", error);
    CFRunLoopStop(CFRunLoopGetCurrent());
}

@Derrick,需要澄清的是,这是因为当滚动时,主线程的运行循环并没有处于默认模式。这与我的意思很接近。希望我没有冒险太远超出我的问题范围。如果我不是只使用基础框架(没有UIKIT,AppKIT等)进行编码,那么我需要创建一个RunLoCon,让NSLLCONTION(类似的)像iOS上那样运行(正确)吗?你不需要创建一个运行循环。但您需要配置并运行它。@Derrick:如果您在命令行工具中使用NSURLConnection,您可能只需要使用
+sendSynchronousRequest:returningResponse:error:
,因为您不需要同时执行任何其他操作(即允许用户单击按钮)@Josh-Yeah我知道对于一个真正的命令行工具异步执行它是不实际的。但原因是我正在尝试编写一个使用aysnc版本的库。我目前正在使用一个简单的iOS应用程序来测试它。在没有GUI或类似的东西的情况下进行开发是很好的。我意识到这是严格实用的,不能满足您对更深入理解的愿望;我不认为我比你更了解它。好吧,这向我展示了如何做我想做的事。我想要更深入的理解(a)完成这项工作,(b)好奇心。所以这还是有点帮助的。谢谢