如何取消异步NSURLConnection

Mar*_*cus 4 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]];
      }
Run Code Online (Sandbox Code Playgroud)

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

hot*_*aw2 6

这可能是Apple文档的问题.

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

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