我正在开发一个应用程序,它将本机联系人上传到服务器然后获取响应(JSON,已安装应用程序的联系人列表)。当本机联系人足够大时,服务器响应将变得缓慢且不稳定。用户不能做其他事情。所以我把网络请求放到后台线程中。每次我上传100个联系人,做一些任务,然后接下来100个联系人,直到循环结束。
但是在跑步中,结果并不像预期的那样。后台线程正在运行,它继续请求服务器。 UI线程被阻止,我仍然无法做任何事情。
这会导致后台线程长循环吗?虽然我有2个线程,但它们会竞争CPU资源(测试设备是iPod,1核心。我认为这可能与核心数字无关)?
有人能告诉我如何处理这种情况的提示吗?提前谢谢!
更新
我找到了根本原因。 App委托中的全局变量设置为错误值,因此UI行为很奇怪。我通过评论所有网络请求方法找到了这个。所以这个问题与多线程无关。很抱歉打扰了。
答案 0 :(得分:0)
我认为需要对如何执行网络操作进行一些澄清。
1,NSOperatiomQueue处理NSOperations,因此您可能将网络代码包装在NSOperation子类中。
第二,您使用NSURLConnections作为网络代码吗?
第3,阻止部分是NSURLConnection还是委托NSURLConnection的回调?
要注意的一点是,简单的'NSURLConnections是在多线程引擎下实现的。默认情况下(从主线程运行时)对象被置于主线程运行循环中,但该对象只是一个包装器,它处理从另一个线程上发生的较低级别网络代码(BSD套接字)到委托的回调。
你真的不应该在主线程上使用NSURLConnections阻止你的UI,除非A)你在委托回调方法中用昂贵的代码阻塞线程或者B)你的同时压倒你的运行循环URL连接(这是NSOperationQueue的setMaxConcurrentOperationsCount:发挥作用的地方)