2011-12-30 72 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