取消内部连接操作

时间:2009-11-21 17:24:52

标签: objective-c cocoa nsurlconnection nsoperation

我有一个使用NSURLConnection下载一些数据的NSOperation,看起来有点像这样:

....
- (void)main
{
....
   while (!self.isCancelled && !self.isLoaded)
   {
      [NSRunloop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NDate distantFutute]];
   }
....
}

问题是连接不时挂起,并且由于没有其他源触发,循环会一直运行,没有机会取消操作。由于我的操作队列中有1个操作的限制,所以一切都被卡住了。

问题是这个问题的最佳解决方案是什么。

  1. 而不是remoteFuture使用较短的时间段,如半秒。 (可能会吃额外的cpu周期)
  2. 尝试在ivar中存储对运行线程的引用,并通过在operartion的cancel方法中的线程上执行选择器来运行循环。 (当我们在已经退出并且将不再运行的运行循环上排队选择器时会导致这种情况,据我所知导致泄漏)
  3. 或许还有另一种方式?

1 个答案:

答案 0 :(得分:3)

这是一种混合方法:

  • 运行循环最长时间,您愿意等待数据加载(beforeDate:[NSDate dateWithTimeIntervalSinceNow:kConnectionMaxWaitSeconds])。
  • 创建版本0运行循环源(CFRunLoopSourceCreate)并在开始等待之前将其添加到运行循环中。
  • -cancel方法信号源(CFRunLoopSourceSignal)并唤醒(CFRunLoopWakeUp)运行循环。