i have a problem with queued functions. i want to run my function and when my first function finishes running, i want to start other one.
-(void)firstFunct
{
// sending and getting information from server.
// doing sth and creating data to use in my second function.
}
and my second function is:
-(void)secondFunct
{
// using data coming from first function
}
i am now using these 2 functions in like that
-(void)ThirdFunct
{
[self firstFunct];
[self performSelector:@selector(secondFunct) withObject:nil afterDelay:0.5];
}
but there is a problem that this method is not good to use. i want to learn if there is an efficient way to run the functions one after the other.
Cocoa offers nice concurrency management classes like
NSOperationandNSOperationQueue. You could use them to simplify the logic behind chaining your asynchronous calls without creating explicit connections in code to call method 3 after work 2 completes, and method 2 after work 1 completes, and so on. Using dependency management, you could easily specify those dependencies between your operations.Here’s a simple example of how you would use that code. Suppose you are downloading some data asynchronously in all those three methods, and you’ve created a
NSOperationsubclass calledDownloadOperation.First, create a
NSOperationQueue.Then, create the three download operations.
Then, specify the dependencies between your operations. Dependencies simply say that an operation can run only if all the operations it depends upon are complete. In your example, the dependencies look like
c <- b <- a, which can be broken down into two steps:Now add these operations to the queue.
The queue will automatically start processing all operations at this point, but since we’ve creating this chaining sort of a dependency, they will be executed one after the other in our particular example.
I’ve created a sample project on github demonstrating it with a simple example at https://github.com/AnuragMishra/ChainedOperationQueue. It fakes an asynchronous operation by creating a timer, and when the timer finishes, the operation is marked complete. It’s written using Xcode 4.5, so let me know if you have issues compiling it in older versions.