我正在尝试在后台线程中运行下载,以免阻塞 iOS 上的主 UI 线程,我所做的是使用创建一个新线程
[NSThread detachNewThreadSelector:@selector(startDownload) toTarget:downloadObject withObject:nil];
然后下面的代码在后台线程上运行:
NSURL* urlForCalendar = [NSURL URLWithString:@"http://www.apple.com/"];
urlRequest = [NSURLRequest requestWithURL:urlForCalendar];
urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self startImmediately:NO];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
[urlConnection scheduleInRunLoop:runLoop forMode:NSRunLoopCommonModes];
[urlConnection start];
但是,永远不会调用委托(delegate)回调。
编辑:
对于将来可能遇到类似问题的任何人,经过一番尝试弄清楚它为什么不起作用之后,我并没有运行循环。所以最后 3 行代码实际上应该是:
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
[urlConnection scheduleInRunLoop:runLoop forMode:NSRunLoopCommonModes];
[urlConnection start];
[runLoop run];
最佳答案
您不运行您创建的线程的运行循环,因此您添加到运行循环的连接永远不会得到服务,并且您永远不会得到任何回调。
通常,您只想处理主线程上的回调,然后在需要繁重的处理时将结果推送到后台线程。
只要您运行运行循环并在下载完成后正确整理,您就可以做您当前正在做的事情。
关于ios - 使用 NSThread 时未调用 NSURLConnectionDelegate 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25023644/