2012-05-06 163 views
1

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

但是在运行中,结果并不如预期。后台线程正在运行,它保持请求服务器。 UI线程被阻塞,我仍然无能为力。

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

任何人都可以告诉我如何处理这种情况的提示?提前致谢!

更新:

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

+0

您使用的是GCD吗? – CodaFi

+0

@CodaFi 不,我在应用程序委托中使用NSOperationQueue。 100个联系人的每个请求都会被放入队列中。 – LetBulletFlies

+0

我想更好的问题是:你可以使用GCD吗?或者你需要瞄准iOS 3.x? – CodaFi

回答

0

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

1,NSOperatiomQueue处理NSOperations,所以你可能将你的网络代码包装在一个NSOperation子类中。

第二,你是否在为你的网络代码使用NSURLConnections?

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

需要注意的一点是,普通ol'NSURLConnections是在多线程引擎下实现的。该对象默认放置在主线程的运行循环中(当从主线程运行时),但该对象只是一个包装器,它处理从另一个线程上发生的来自底层网络代码(BSD套接字)的委托的回调。

你真的不应该能够在主线程上用NSURLConnections阻止你的用户界面,除非A)你在委托回调方法中用昂贵的代码阻塞线程,或者B)太多的运行循环压倒你同时URL连接(这是NSOperationQueue的setMaxConcurrentOperationsCount:进场的地方)

+0

Thx。我的回答:第一,是的,我正在使用NSInvocationOperation来包装网络请求方法。第二/第三,不,我使用SDK方法来请求服务器,它是同步调用。 – LetBulletFlies

+0

我只是想知道是否可以在多个线程中访问Appdelegate。服务器请求方法在应用程序委托中,并将在后台线程中调用。我会尝试将它移到其他地方。 – LetBulletFlies

相关问题