遇到NSURLConnection问题,如果我创建一个NSURLConnection并调用[connection connectionWithRequest]让它加载一点然后调用[连接取消]大部分时间工作正常。然而偶尔甚至在我调用[连接取消]之后,连接的委托仍然被调用(这会使应用程序崩溃)。谷歌搜索它看起来像这里的问题是在runloop中的竞争条件,我取消连接并释放委托但在runloop循环之前它调用委托函数 - >崩溃。
在我打电话给[连接取消]确认连接已经取消后,有没有办法让我这样做?即使是糟糕的while()循环也可以:(
答案 0 :(得分:6)
你不应该释放连接&相关存储空间,直到您的代理人收到connectionDidFinishLoading:
或connectionDidFailWithError:
消息。
Delegates are not normally retained by the object they're acting as delegate for。但是在这种情况下它是,所以当NSURLConnection仍然引用它时,委托不应该变为无效,除非你以某种方式过度释放它。
答案 1 :(得分:0)
我还没有遇到这个问题,但这也可以在不占用您的委托对象的情况下运行:
由于所有委托方法都接收调用Connection对象作为参数,并且您也知道实际的活动Connection对象(或nil),因此只需通过比较两个对象来忽略委派操作。这样,取消的“ghost”Connection对象仍然可以调用委托,但不会干扰其内部。
- (void) connection:(NSURLConnection*) connection didReceiveData:(NSData*) data
{
if(connection != _URLConnection){return;}
...
[_incomingData appendData:data];
...
}
其中_URLConnection
是您的委托中设置为活动连接的属性,或者为nil。