2011-12-30 33 views
4

我正在执行一些NSOperation对象由NSOperationQueue管理的对象。该代码还包含使用performSelector:withObject:afterDelay:的延迟方法调用。performSelector:withObject:afterDelay:在NSOperation内

的问题是,对应的选择器被称为延迟,是不叫在所有

读到this answer to a StackOverflow question后,我猜这是因为NSOperation已经完成了,它的线程已经不存在了,“忘记”了对选择器的预定调用。

我该如何解决这个问题? 如何在NSOperation内对某个方法进行延迟呼叫?

回答

4

一种可能是使用大中央调度,即dispatch_after()

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_after(popTime, queue, ^{ 
    ... 
}); 

相反的dispatch_get_global_queue(),你当然也可以创建自己的调度队列或使用主队列dispatch_get_main_queue()

+0

因为我对'NSOperationQueue'和甚至更多'GCD'都很陌生,我可以以某种方式使用'NSOperationQueue',当前的'NSOperation'正在执行,作为调度队列用GCD延迟发送? – fabb 2011-12-30 17:38:00

+0

上面的代码不能与'dispatch_get_global_queue'一起使用,但它可以与'dispatch_get_main_queue'一起使用。任何想法为什么? – fabb 2012-01-03 15:18:55

+0

我对GCD并不是很了解,所以我不完全了解排队到GCD上的保留/释放过程的后果,但我的猜测是,你的原始问题是由面对你的所有对象NSOperation被释放。如果您在NSOperation中搜索与使用异步NSURLConnection相关的问题,您将看到与维护指向对象的指针有关的解决方法,以使NSOperation不受“完成”的限制。 – 2012-09-26 21:38:48

相关问题