2010-09-10 80 views
4

NSURLConnection上的调用实例方法取消通常根本不会取消连接。如何取消异步NSURLConnection

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

是否有立即取消连接的方法?大多数情况下,它会继续在后台运行,直到请求完成,即使连接都被取消并设置为零。 NSOperation子类是在连接被取消之后处理的,其中连接被释放。即使在那之后,异步连接仍在继续运行!

是否有另一种方法取消它?或者它的线程可以取消吗?

下面的代码片段从我的NSOperation子类的主要方法:

 // 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]]; 
     } 

注:启用无线网络时,这种行为才会发生。使用3G/Edge/GPRS可以正常工作

回答

6

这可能是Apple文档中的问题。

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

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

+0

感谢您的回复!目前我没有遇到任何泄漏或崩溃。 – Marcus 2010-09-11 12:28:48

+0

看起来执行异步连接的线程正在被阻塞,直到它本身检查取消或已完成,并且没有什么可以处理它。而当它以高速(WiFi)传输较少量的数据(2mb)时,有时线程会到达终点,并且不检查它是否被取消。我现在将此标记为正确的答案。谢谢! – Marcus 2010-10-05 14:38:55

-3

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

+0

感谢您的回答! while循环在调用cancel之后结束,所以我不认为这是问题所在。 – Marcus 2010-10-05 12:59:56

+1

FWIW,这不是Objective-C消息的工作方式 - 它们不会进入队列 - 它们会立即同步执行。 – Bill 2011-08-11 22:22:05

0

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