Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call performSelectorInBackground with a function having arguments?

Sorry for the newbie question (maybe). I'm developing an app for ios and i'm trying to execute an external xml reading out of the main thread in order not to freeze the ui while the call is doing its magic.

This is the only way i know to made a process not to execute in the main thread in objective c

[self performSelectorInBackground:@selector(callXml)
                           withObject:self];

so i did incapsulate my call into a function

 - (void)callXml{
     [RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
 }

Now i have to make the string indXML be a parameter of the function in order to call different xml as i need to. Something like

 - (void)callXml:(NSString *) name{
     [RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
 }

In this case, how the call to performSelector change? If i do it in the usual way i get syntax errors:

[self performSelectorInBackground:@selector(callXml:@"test")
                           withObject:self];
like image 852
Sasha Grievus Avatar asked May 14 '13 08:05

Sasha Grievus


2 Answers

[self performSelectorInBackground:@selector(callXml:)
                       withObject:@"test"];

ie: what you pass in as withObject: becomes the parameter to your method.

Just as a point of interest here's how you could do it using GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self callXml:@"test"];

    // If you then need to execute something making sure it's on the main thread (updating the UI for example)
    dispatch_async(dispatch_get_main_queue(), ^{
        [self updateGUI];
    });
});
like image 76
Mike Pollard Avatar answered Oct 11 '22 17:10

Mike Pollard


For this

- (void)callXml:(NSString *) name{
     [RXMLElement elementFromURL:[NSURL URLWithString:indXML]];
 } 

You can call like this

  [self performSelectorInBackground:@selector(callXml:)
                               withObject:@"test"];

If your method has parameter then : is used with method_name and pass parameter as withObject argument

like image 43
βhargavḯ Avatar answered Oct 11 '22 18:10

βhargavḯ