I have 2 methods to be executed on a button click event say method1:
and method2:
.Both have network calls and so cannot be sure which one will fin
You could just use a flag (aka a BOOL variable) that lets you know in either methods (A or B) if the other one has completed yet. Something on the lines of this:
- (void) methodA
{
// implementation
if (self.didFinishFirstMethod) {
[self finalMethod];
} else {
self.didFinishFirstMethod = YES;
}
}
- (void) methodB
{
// implementation
if (self.didFinishFirstMethod) {
[self finalMethod];
} else {
self.didFinishFirstMethod = YES;
}
}
- (void) finalMethod
{
// implementation
}
Cheers!
Neat little method I got from Googles iOS Framework they rely on pretty heavily:
- (void)runSigninThenInvokeSelector:(SEL)signInDoneSel {
if (signInDoneSel) {
[self performSelector:signInDoneSel];
}
}
This is what dispatch groups are for.
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
// Add a task to the group
dispatch_group_async(group, queue, ^{
[self method1:a];
});
// Add another task to the group
dispatch_group_async(group, queue, ^{
[self method2:a];
});
// Add a handler function for when the entire group completes
// It's possible that this will happen immediately if the other methods have already finished
dispatch_group_notify(group, queue, ^{
[methodFinish]
});
Dispatch groups are ARC managed. They are retained by the system until all of their blocks run, so their memory management is easy under ARC.
See also dispatch_group_wait()
if you want to block execution until the group finishes.