为什么我的后台工作线程阻止UI线程?

时间:2012-05-06 04:56:30

标签: ios multithreading

我正在开发一个应用程序,它将本机联系人上传到服务器然后获取响应(JSON,已安装应用程序的联系人列表)。当本机联系人足够大时,服务器响应将变得缓慢且不稳定。用户不能做其他事情。所以我把网络请求放到后台线程中。每次我上传100个联系人,做一些任务,然后接下来100个联系人,直到循环结束。

但是在跑步中,结果并不像预期的那样。后台线程正在运行,它继续请求服务器。 UI线程被阻止,我仍然无法做任何事情。

这会导致后台线程长循环吗?虽然我有2个线程,但它们会竞争CPU资源(测试设备是iPod,1核心。我认为这可能与核心数字无关)?

有人能告诉我如何处理这种情况的提示吗?提前谢谢!

更新

我找到了根本原因。 App委托中的全局变量设置为错误值,因此UI行为很奇怪。我通过评论所有网络请求方法找到了这个。所以这个问题与多线程无关。很抱歉打扰了。

1 个答案:

答案 0 :(得分:0)

我认为需要对如何执行网络操作进行一些澄清。

1,NSOperatiomQueue处理NSOperations,因此您可能将网络代码包装在NSOperation子类中。

第二,您使用NSURLConnections作为网络代码吗?

第3,阻止部分是NSURLConnection还是委托NSURLConnection的回调?

要注意的一点是,简单的'NSURLConnections是在多线程引擎下实现的。默认情况下(从主线程运行时)对象被置于主线程运行循环中,但该对象只是一个包装器,它处理从另一个线程上发生的较低级别网络代码(BSD套接字)到委托的回调。

你真的不应该在主线程上使用NSURLConnections阻止你的UI,除非A)你在委托回调方法中用昂贵的代码阻塞线程或者B)你的同时压倒你的运行循环URL连接(这是NSOperationQueue的setMaxConcurrentOperationsCount:发挥作用的地方)