2013-07-18 38 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]; 
});