performselector afterdelay无法正常工作

时间:2012-02-22 06:30:13

标签: ios ios5 thread-safety

我在uiview子类中使用以下方法:

[self performSelector:@selector(timeout) withObject:nil afterDelay:20];

按预期方法在20秒后调用该方法。 在另一种方法中,我尝试使用以下代码取消执行请求:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil];

我也试过

[NSRunLoop cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil];

这两条消息都没有带来预期的结果,仍然会调用超时方法。 任何人都能解释一下我做错了什么以及如何以正确的方式做到这一点?

来自奥地利的欢呼声 马丁

4 个答案:

答案 0 :(得分:3)

两点
1.两个self都是同一个对象吗? 2. [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(timeout) object:nil];是否在您调用[self performSelector:@selector(timeout) withObject:nil afterDelay:20];的同一个线程上执行了?

检查这两个问题。

答案 1 :(得分:3)

在您的班级中使用存储为实例变量的NSTimer。如果要取消执行,请使计时器失效并销毁。

在@interface中:

@property (readwrite, retain) NSTimer *myTimer;

在@implementation中:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:20 target:self selector:@selector(timeout) userInfo:nil repeats:NO];

然后,如果发生某些情况并且不再调用超时方法:

[self.myTimer invalidate];
self.myTimer = nil; // this releases the retained property implicitly

答案 2 :(得分:1)

你可以用两种方式做到这一点:

  1. 您可以使用此功能删除所有排队的

    [NSObject cancelPreviousPerformRequestsWithTarget:self];

  2. 您可以单独删除每个

    [NSObject cancelPreviousPerformRequestsWithTarget:self                                          选择器:@selector(超时)                                            对象:无];

答案 3 :(得分:1)

试试这个:

[self performSelectorOnMainThread:@selector(timeout) withObject:self waitUntilDone:NO];