It's not complicated at all, and there are definitely multiple solutions. I would choose a very OOP approach and start by defining a "Wave" object.
You just need a way to isolate the properties that define each wave. For instance, the # of objects in the wave could be one property, as well as the length of time to wait before the first object comes down ( this would be the "pause" in between each of the waves that you mention ).
So you could start by defining a few arbitrary waves:
Code:
//this wave will have 5 objects, and would wait 3 seconds before starting
Wave* wave1 = [Wave waveWithObjectCount: 5 andInitialPause: 3];
//this wave will have 3 objects and wait 8 seconds before starting
Wave* wave2 = [Wave waveWithObjectCount: 3 and InitialPause:8];
...// and so on
In order to get your "unlimited" effect, you could create, say 10 different waves and then store them all in an NSArray and just loop through them over and over again.
Now, with y our timer, you would just go through and grab each Wave object out of the array and add your troops to the screen and so forth just like you have been doing.