2013-12-21 68 views
0

又回到了主線程我有一個像NSTimer定義:從的NSTimer

[NSTimer scheduledTimerWithTimeInterval:self.speed target:self selector:@selector(displayTextOverTime:) userInfo:nil repeats:YES]; 

displayTextOverTime顯示一些文本的方法,那麼一旦顯示文本的最後一塊是無效它的計時器,並要求處理的另一種方法(其本身可能需要啓動NSTimer來顯示文本)。

有沒有一個標準的方法來做這種事情?我原來的做法是直接調用另一個方法,但是這讓我有些奇怪的行爲,我嵌套了NSTimer(它永遠不會死,因爲即使它們失效並且不會再循環,它們不是'完成'的,因爲它們內部的計時器仍在運行......或者某些東西?),這不是我想要的。有沒有什麼方法可以說「調用這個方法,但是在NSTimer以外」呢,就像回到主線程一樣?

具體來說,我看到更多的定時器被殺害比開始(我有一個方法殺死任何傳遞的定時器,所以我可以記錄它被殺死時)。

+0

有'NSObject'方法['performObjectOnMainThread:withObject:waitUntilDone:'](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference html的#// apple_ref/DOC/UID/20000050-CJBEHAEF)。 – user1118321

+0

1.創建可重複計時器並沒有意義,然後在每次調用時使其無效。 2.你可以調用performSelector:afterDelay,延遲時間爲零 - 該方法將在主循環的下一個循環中運行。 – EricS

+0

對於EricS,我不會在每次調用時都使其無效。相反,我在說:「每X毫秒調用一次這個方法,直到它讓你知道它已經完成,然後每X毫秒調用一次該方法,直到它讓你知道它已經完成」。每次以簡單的閱讀速度顯示文本一個單詞,然後獲取更多文本(如果存在),然後再一次顯示一個單詞。 – Jenny

回答

3

爲了準確回答您的問題,您可以使用Grand Central Dispatch在定時器之外運行一個功能。你想運行功能把這個:

dispatch_async(dispatch_get_main_queue(), ^{ 
     (your function or block of code goes here) 
    }); 

這將運行你的計時器以外的塊。您可以選擇在主線程,全局線程或具有您創建的隊列的自定義線程上執行此操作。