Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper way to delay while allowing the run loop to continue

I have a need to delay for a certain amount of time and yet allow other things on the same runloop to keep running. I have been using the following code to do this:

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];

This seems to do exactly what I want, except that sometimes the function returns immediately without waiting the desired time (1 second).

Can anyone let me know what could cause this? And what is the proper way to wait while allowing the run loop to run?

NOTE: I want to delay in a manner similar to sleep(), such that after the delay I am back in the same execution stream as before.

like image 545
Locksleyu Avatar asked Oct 12 '12 19:10

Locksleyu


3 Answers

You should use GCD and dispatch_after for that. It is much more recent and efficient (and thread-safe and all), and very easy to use.

There is even a code snippet embedded in Xcode, so that if you start typing dispatch_after it will suggest the snippet and if you validate it will write the prepared 2-3 lines for you in your code :)

Code Snippet suggestion by Xcode

int64_t delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    <#code to be executed on the main queue after delay#>
});
like image 149
AliSoftware Avatar answered Oct 13 '22 00:10

AliSoftware


Use an NSTimer to fire off a call to some method after a certain delay.

like image 41
Joshua Nozzi Avatar answered Oct 12 '22 23:10

Joshua Nozzi


Have you tried performSelector:withObject:afterDelay:?

From the Apple documentation

Invokes a method of the receiver on the current thread using the default mode after a delay.

like image 44
marcos1490 Avatar answered Oct 12 '22 23:10

marcos1490