connection:didReceiveResponse:来自NSURLConnectionDelegate永远不会被解雇

时间:2012-06-13 15:57:43

标签: objective-c multithreading nsoperation nsoperationqueue uiprogressview

我正在努力让UIProgressView,NSURLConnection,NSOperation和NSOperationQueue一起工作。 以下是代码:http://pastie.org/4080576

问题: connection:DidReceiveData:从未调用:执行立即转到-start(),通过-main(),然后转到-connection:DidReceiveResponse:,回到-main()(有时),最后转到{{1 }}

当我尝试从此链接下载图片时: http://upload.wikimedia.org/wikipedia/commons/4/41/Kharkov_picture_1787.jpg 我得到了这个输出:

  

2012-06-13 19:43:06.189 downloadsFilesInOpQueue [5070:f803]收到   回复:2012-06-13 19:43:06.190   downloadsFilesInOpQueue [5070:f803] Filesize是:3075638建议   文件名是:Kharkov_picture_1787.jpg 2012-06-13 19:43:12.476   downloadsFilesInOpQueue [5070:f803]完成下载。收到0   字节

另外,我无法弄清-connectionDidFinishDownloading:destinationURL:所属的位置: NSURLConnectionDelegate或NSURLConnectionDataDelegate。

P.S。如果有一些风格问题,我很乐意听到它们。 THX。

1 个答案:

答案 0 :(得分:1)

我强烈怀疑你的“忙”while循环正在消耗底层运行循环的执行,并阻止NSURLConnection在数据到达时处理数据。

查看你的pastie.org代码,这是你的主要罪魁祸首:

while (![self isFinished]) {
    ...
    while ([self fileSize] == 0) {}
    while ([self receivedDataLength] == 0) {}
    ...
}

这样的繁忙循环几乎不会在iOS中使用。 iOS编程主要是事件驱动的,尤其是NSURLConnection。相反,请更新您的UIProgressView以回复connection:DidReceiveData:等。

老实说,编写自己的NSURLConnection处理程序是一种混乱的痛苦。我强烈建议您考虑使用一个处理一些困难的开源库。这里有两个不错的结果:

  1. https://github.com/AFNetworking/AFNetworking
  2. https://github.com/pokeb/asi-http-request
相关问题