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

1

8

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...

Sillimanite answered 5/10, 2011 at 9:59 Comment(0)
J
6

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.

Jugendstil answered 5/10, 2011 at 10:14 Comment(1)
What if you just want to ignore successive calls without modifying the first scheduled one? For instance calls to update a table view.Incapacious

© 2022 - 2024 — McMap. All rights reserved.