I’m trying to perform the acquisition of data from the internet on the load of my view. To not lag the UI, I’m performing the HTML download and parsing by using
[self performSelectorInBackground:@selector(alertThreadMethod) withObject:nil];
which checks to see if there is an alert online. In order to display the information on the view however, iOS says that I need to use the main thread. So i call the display code right after:
[self performSelectorInBackground:@selector(alertThreadMethod) withObject:nil];
[self loadAlert];
In doing this, the [self loadAlert]; actually runs before the selector in the background (it is faster). Because of this, it does not have the information that the selector in the background is supposed to provide it.
How can I ensure that [self loadAlert]; runs after? Or is there a better way to do this?
You can either move loadAlert invocation into the alertThreadMethod or use Grand Central Dispatch serial queues, e.g.,
Or, if loadAlert is updating the UI, since you do UI updates in the main queue, you’d do something like:
By the way, if you’re just doing this one task in background, rather than creating your own serial queue, you might just use one of the existing background queues. You only need to create a queue if you need the serial nature (i.e. you’re going to be numerous dispatch_async calls and you can’t have them running concurrently). But in this simple case, this might be even a little more efficient, bypassing the creating and releasing of the serial queue: