如何取消异步NSURLConnection

时间:2010-09-10 12:22:13

标签: iphone nsurlconnection

在NSURLConnection上调用实例方法取消通常根本不取消连接。

我正在NSOperation中执行异步NSURLConnection。如果操作被取消,则通过在NSURLConnection上调用cancel然后将连接设置为nil来停止连接。

有没有办法立即取消连接?大多数情况下,它会继续在后台运行,直到请求完成,即使连接都被取消并设置为nil。取消连接后释放连接,取消分配NSOperation子类。即便如此,异步连接仍在继续运行!

还有其他方法可以取消它吗?或者它的运行线程可以被取消吗?

以下是我的NSOperation子类main方法的代码片段:

      // Create and start asynchronous connection
      self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
      [request release];

      while(!isFinished) {
          if(self.isCancelled) {
             [self.connection cancel];
             self.connection = nil; 
             [self uploadCanceledDelegate];
             return;
          }

          // Special sleep because callbacks are executed on same thread as this loop
          [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
      }

注意:仅当启用WiFi时才会出现此问题。使用3G / Edge / GPRS,它可以正常工作

3 个答案:

答案 0 :(得分:6)

这可能是Apple文档的问题。

连接当前可能在被阻塞的线程中等待,并且当该线程被阻塞时,操作系统不会立即执行任何操作。线程在以后某个时间段被解除阻塞之前不会被取消。因此,在线程等待超时或关闭的套接字之前,您不应释放处理这些已取消连接的任何对象,直到将来某个未知点。

如果您遇到泄漏或崩溃,您可以尝试将“已取消”的操作对象移动到另一个等待在几秒钟甚至几分钟后释放的东西队列。

答案 1 :(得分:0)

我在使用Lazy图像加载(异步图像加载)时遇到了同样的问题,我所做的是将所有NSURLRequests存储在NSMUtable数组中,当我需要取消所有这些时,我通过for循环完成了它。

答案 2 :(得分:-3)

这可能是因为cancel是一条消息,并且当前函数在while循环中时,消息调度程序无法调度消息。我希望我对Objective C消息的理解在这里是正确的,但如果你允许函数完成并处理在设置了isFinished标志时触发的回调中的其他清理代码,这可能会有效。我准备错了,但我认为问题可能是while循环。