Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if there's a performSelector: waiting to be executed?

In my iPhone app I got several places where I can do a

[object performSelector: withObject: afterDelay:]

call. All lead to the same method. Now, in that method I want to execute some code only on the latest call of it. If it was the first, I could just do [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(thisMethod) object:nil] and be sure it gets called once.

But, is there a way to tell if there are any other method calls waiting to be executed?

I could use a counter in this class that I would increment each time I set this perform after delay, then decrement it at start of each call and only execute the code if this counter is zeroed. But I'm wondering if it's the best/acceptable approach...

like image 456
kender Avatar asked Oct 05 '11 09:10

kender


1 Answers

Well what you could do is this: anytime you call [object performSelector: withObject: afterDelay:] just add the line you mentioned above it. You could actually create a method that handles that for you. For example:

- (void)performSelectorOnce:(SEL)selector withObject:(id)object afterDelay:(NSTimeInterval)delay
{
    [NSObject cancelPreviousPerformRequestsWithTarget:object selector:selector object:object];
    [self performSelector:selector withObject:object afterDelay:delay];
}

and than where ever you use [object performSelector: withObject: afterDelay:] just replace it with [self performSelectorOnce: withObject: afterDelay:];

If you want to use this in multiple objects than you could actually create an NSObject category and add the method there.

Let me know if this works for you.

like image 162
Mihai Fratu Avatar answered Oct 01 '22 20:10

Mihai Fratu