how to call a method of multiple arguments with delay how to call a method of multiple arguments with delay ios ios

how to call a method of multiple arguments with delay


use dispatch_after:

double 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    [self MoveSomethingFrom:from To:to];});

EDIT 2015: For Swift, i recommend using this small helper method: dispatch_after - GCD in swift?


You can also implement method in NSObject's category using NSInvocation object (works in all versions of iOS). I guess it should be something like this:

@interface NSObject(DelayedPerform)- (void)performSelector:(SEL)aSelector withObject:(id)argument0 withObject:(id)argument1  afterDelay:(NSTimeInterval)delay {  NSMethodSignature *signature = [self methodSignatureForSelector:aSelector];  NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];  [invocation setTarget:self];  [invocation setSelector:aSelector];  [invocation setArgument:&argument0 atIndex:2];  [invocation setArgument:&argument1 atIndex:3];  [invocation performSelector:@selector(invoke) withObject:nil afterDelay:delay];}@end


Other ideas:

1)You could use NSInvocations:

+ (NSInvocation *)invocationWithMethodSignature:(NSMethodSignature *)signature
(>> see Eldar Markov's answer)

Documentation:
https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSInvocation_Class/Reference/Reference.html

2) You could use a helper method..

[self performSelector:@selector(helperMethod) withObject:nil afterDelay:delay];- (void) helperMethod{    // of course x1 and x2 have to be safed somewhere else    [object moveSomethigFrom: x1 to: x2];}

3) You could use an array or a dictionary as parameter..

NSArray* array = [NSArray arrayWithObjects: x1, x2, nil];[self performSelector:@selector(handleArray:) withObject:array afterDelay:delay];- (void) handleArray: (NSArray*) array{    [object moveSomethigFrom: [array objectAtIndex: 0] to: [array objectAtIndex: 1]];}