我理解它必须处理启动线程以发出网络请求的丑陋,然后可能使用我的委托方法调用performSelectorOnMainThread:
。
我知道如何在进行iOS编程时使用它,并且效果很好。但是,我想知道如何在(例如)命令行实用程序的上下文中进行操作,其中没有事件处理的UIApplication等。
我已经尝试过,似乎程序在异步调用返回后立即退出,然后才能调用委托方法。我非常希望更深入地了解它是如何工作的。
答案 0 :(得分:7)
根据docs,连接的委托方法在启动连接的同一线程上调用。因此,要保持该线程运行,直到连接有时间来完成它的工作:
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());
}
答案 1 :(得分:2)
委托方法调用在发起连接的线程的runloop上进行调度。所以它不一定是主线程。您可以从任何线程执行此操作。但是你必须有一个运行循环,运行时间足以处理那些委托消息。
默认情况下,运行循环必须以默认模式运行才能触发这些委托方法。因此,这就是为什么,例如,默认情况下,如果从主线程启动异步连接,则在用户滚动tableview或类似内容时,您的委托方法不会触发。
但是你可以通过在你想要的任何其他运行循环和/或你想要的任何运行循环模式上安排委托回调来改变这一点 - [NSURLConnection scheduleInRunLoop:forMode:]
我希望你问的是什么?