ios - 使用 NSThread 时未调用 NSURLConnectionDelegate 方法

标签 ios objective-c multithreading nsurlconnection nsrunloop

我正在尝试在后台线程中运行下载,以免阻塞 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/

相关文章:

iOS swift ImagePickerController : Improving Edit Mode

objective-c - 创建多个 UILocalNotification

ios - 如何实现像 iOS MAIL 应用程序这样的平移手势,以便一次只打开一个单元格?

objective-c - 在 UIViewController 上设置只读 navigationController 属性以进行模拟

C# 定期从不同线程返回值

ios - Apple 的外部配件(蓝牙)仅适用于 MFI 设备?

ios - 如何访问 UIImageView 以使用 Picker Controller 设置图像

Python 多线程转入 Celery 任务。 celery_task.update_state() 错误

iphone - 如何在AVPlayer播放时开始播放下一首歌曲或识别歌曲已结束?

java如何定义newFixedThreadPool的大小