里面

2009-11-21 42 views
2

连接取消操作我有使用NSURLConnection的下载一些数据的NSOperation,它看起来有点像这样:里面

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

的问题是,不时连接挂起,因为没有其他来源的射击,循环会一直运行,不会取消操作。由于在我的操作队列中有1个操作的限制,所以一切都很困难。

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

  1. 而不是遥远未来使用一个较短的时间段,如半秒钟。 (可能会吃掉额外的cpu周期)
  2. 尝试在运行的取消方法中通过线程上的执行选择器来存储对运行线程的引用。 (可能会导致当我们在已经退出并且不再运行的运行循环中排队选择器时的情况,就我所知,这会导致泄漏)

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

回答

3

这里是一个混合的方法:

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

非常有趣的方法。肯定会尝试一下,谢谢。 – stackzerad 2009-11-22 07:41:06

+0

还有一个问题。什么是创建和信号源的?为什么我不能只调用CFRunLoopWakeUp? – stackzerad 2009-11-23 07:34:41

+0

也许没有必要。尝试使用'CFRunLoopWakeUp()'并参阅。 – 2009-11-24 05:13:51