2013-07-18 37 views
2

我在一個類方法中,並且想要在延遲後從同一個類中觸發另一個類方法。似乎沒有我可以使用延遲後可以執行類方法嗎?

[MyClass performSelector:@selector(myMethod) withObject:nil afterDelay:1] 

還有其他選擇嗎?

被修改:

我的不好。我認爲這個調用在類方法中是不可用的,因爲它不會像我寫的那樣自動完成。正如一些人在這裏指出的那樣,它實際上工作正常。不知道爲什麼它沒有在我的情況下自動完成,但是在發生這種情況時學到了一個關於做出假設的教訓。感謝大家。

+0

你是什麼意思的延遲?爲什麼不能在第一種方法之後調用第二種方法? – user2277872

+0

我的意思是在調用該方法之前延遲n秒。如果某個條件不滿足,我想在n秒後再次嘗試方法調用。實例方法沒有問題,但performSelector:afterDelay:似乎不能從類方法中使用。 –

+2

在Objective-C中,所有類對象都是基類的實例。因此,如果MyClass繼承自NSObject,那麼NSObject的所有* instance *方法也是MyClass的* class *方法。你可以閱讀更多在http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html如果你好奇爲什麼... –

回答

4

您使用-class得到一個實際的參考類,然後消息時,它就像這樣:

[[MyClass class] performSelector:@selector(myClassMethod) withObject:nil afterDelay:1.0]; 
+0

謝謝。出於興趣,爲什麼我需要使用[[MyClass類]來調用[performSelector:afterDelay:],但是要立即調用方法,我可以只寫[MyClass myMethod]? –

+1

Objective-C類實際上是爲其實例提供模板的對象。如果你編寫'[MyClass myClassMethod]',它和編寫'[[MyClass class] myClassMethod]'基本相同,但是編譯器會照顧它,所以你不必這樣做。當你用'-performSelector:'動態地發送一個類時,編譯器無法爲你處理,你必須手動獲取對這個類的引用。 –

+0

@JamesWhite你沒有。 '[MyClass performSelector ...]'應該可以正常工作。如果你想通過這個類作爲參數,雖然需要'[MyClass class]'。 –

1

您還可以使用dispatch_after

double delayInSeconds = 2.0; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    [MyClass myClassMethod]; 
});