代码之家  ›  专栏  ›  技术社区  ›  Marcus

如何取消异步连接

  •  4
  • Marcus  · 技术社区  · 14 年前

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

    我正在NSO操作中执行异步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 回复  |  直到 14 年前
        1
  •  6
  •   hotpaw2    14 年前

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

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

        2
  •  0
  •   Inam Abbas    13 年前

    我在使用延迟映像加载(异步映像加载)时遇到了相同的问题。我所做的是将所有NSURLRequests存储在一个NSMUtable数组中,当我需要取消所有这些请求时,我通过for循环来完成。

        3
  •  -3
  •   gavin    14 年前

    这可能是因为cancel是一条消息,而当当前函数位于while循环中时,消息调度器无法分派该消息。我希望我对Objective C消息的理解在这里是正确的,但是如果您允许函数在设置isFinished标志时触发的回调中完成并处理其他清理代码,那么这可能是可行的。我准备错了,但我认为问题可能是while循环。