1

我正在开发一个应用程序,该应用程序将本机联系人上传到服务器然后获取响应(JSON,已安装该应用程序的联系人列表)。当原生联系人足够大时,服务器响应会很慢且不稳定。并且用户不能做其他事情。所以我将网络请求放入后台线程。每次我会上传 100 个联系人,做一些任务,然后下 100 个联系人,直到循环完成。

但是在运行中,结果并不如预期。后台线程正在运行,它一直在请求服务器。UI线程被阻塞了,我还是什么都做不了。

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

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

更新:

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

4

1 回答 1

0

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

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

第二,您是否使用 NSURLConnections 作为您的网络代码?

3,阻塞部分是 NSURLConnection 还是你为 NSURLConnection 委托回调?

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

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

于 2012-05-06T07:13:33.033 回答