2

Is there a way to delay a method call before it changes a key value in the user defaults?

For instance; I have method A which is an IBAction and Method B. If a key "keyOne" is false; method A sets "keyOne" to true via the -[NSUserDefaults setBool: forKey:] and then calls method B with an integer input of for time delay. Method B then needs to wait for whatever the delay was input to be in seconds and then change the "keyOne" back to true with the same NSUserDefaults.

BenMorel
  • 34,448
  • 50
  • 182
  • 322
Timothy Frisch
  • 2,995
  • 2
  • 30
  • 64

2 Answers2

9

Use GCD's dispatch_after() to delay the operation. But, instead of using the main queue as generated by the Xcode code snippet, create your own queue, or utilize the background queue.

dispatch_queue_t myQueue = dispatch_queue_create("com.my.cool.new.queue", DISPATCH_QUEUE_SERIAL);

double delayInSeconds = 10.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, myQueue, ^(void){

    // Reset stuff here (this happens on a non-main thead)
    dispatch_async(dispatch_get_main_queue(), ^{
        // Make UI updates here. (UI updates must be done on the main thread)
    });
});

You can find more information on the difference between using performSelector: and dispatch_after() in the answer in this post: What are the tradeoffs between performSelector:withObject:afterDelay: and dispatch_after

Community
  • 1
  • 1
Mick MacCallum
  • 129,200
  • 40
  • 280
  • 281
3

You can use perform selector from method A to call method B:

[self performSelector:@selector(methodName) withObject:nil afterDelay:1.0];

If your method B needs to know the delay you can use withObject: to pass parameter, it needs to be NSNumber, not integer.

Greg
  • 25,317
  • 6
  • 53
  • 62