2

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

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

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

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

  1. 使用更小的时间段(例如半秒)来代替 distinctFuture。(可能会吃掉额外的 CPU 周期)
  2. 尝试在 ivar 中存储对正在运行的线程的引用,并通过在操作的取消方法中对线程执行选择器来触发运行循环。(可能会导致我们在已经退出且将不再运行的运行循环上排队选择器,据我所知,这会导致泄漏)

或者也许还有另一种方式?

4

1 回答 1

3

这是一种混合方法:

  • 在您愿意等待数据加载的最长时间内运行运行循环 ( beforeDate:[NSDate dateWithTimeIntervalSinceNow:kConnectionMaxWaitSeconds])。
  • 创建一个版本 0 的运行循环源 ( CFRunLoopSourceCreate) 并将其添加到运行循环中,然后再开始等待。
  • -cancel方法信号源(CFRunLoopSourceSignal)和唤醒(CFRunLoopWakeUp)运行循环。
于 2009-11-22T00:23:12.227 回答