iOS - How to implement a performSelector with multiple arguments and with afterDelay? iOS - How to implement a performSelector with multiple arguments and with afterDelay? ios ios

iOS - How to implement a performSelector with multiple arguments and with afterDelay?


Personally, I think that a closer solution to your needs is the use of NSInvocation.

Something like the following will do the work:

indexPath and dataSource are two instance variables defined in the same method.

SEL aSelector = NSSelectorFromString(@"dropDownSelectedRow:withDataSource:");if([dropDownDelegate respondsToSelector:aSelector]) {    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[dropDownDelegate methodSignatureForSelector:aSelector]];    [inv setSelector:aSelector];    [inv setTarget:dropDownDelegate];    [inv setArgument:&(indexPath) atIndex:2]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation    [inv setArgument:&(dataSource) atIndex:3]; //arguments 0 and 1 are self and _cmd respectively, automatically set by NSInvocation    [inv invoke];}


Because there is no such thing as a [NSObject performSelector:withObject:withObject:afterDelay:] method.

You need to encapsulate the data you want to send along into some single Objective C object (e.g. a NSArray, a NSDictionary, some custom Objective C type) and then pass it through the[NSObject performSelector:withObject:afterDelay:] method that is well known and loved.

For example:

NSArray * arrayOfThingsIWantToPassAlong =     [NSArray arrayWithObjects: @"first", @"second", nil];[self performSelector:@selector(fooFirstInput:)            withObject:arrayOfThingsIWantToPassAlong             afterDelay:15.0];


You can package your parameters into one object and use a helper method to call your original method as Michael, and others now, have suggested.

Another option is dispatch_after, which will take a block and enqueue it at a certain time.

double delayInSeconds = 15.0;dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);dispatch_after(popTime, dispatch_get_main_queue(), ^(void){    [self fooFirstInput:first secondInput:second];});

Or, as you've already discovered, if you don't require the delay you can just use - performSelector:withObject:withObject: