I think that NSTimer isn’t a very good fit for what you want to achieve. What you describe is an edit list of audio clips, and what you are attempting to build using arrays and dictionaries already exists as first class API:
AVComposition and its mutable counterpart.
Because these classes inherit AVAsset, you can play instances of them using an AVPlayer. And even though AVPlayer does not have looping built in, you can use its subclass AVQueuePlayer to achieve looping by periodically checking, whether the player’s currentItem is identical to the last object in its items, and then just inserting a mutableCopy of it at the end. (It has to be a mutable copy, because for immutable classes, copy usually returns the instance itself, thus the test for identity would always evaluate to true.)
Since you don’t want to re–enqueue the last item while the player isn’t playing, you can schedule a block with the player itself. This frees you from keeping track of player state for scheduling/unscheduling timers.
So all that’s really left is
- Create an AVMutableComposition
- One by one, insert your sound clips followed by an appropriate empty time range for the pause
- Create an AVQueuePlayer that automatically plays the next item when its current item end
- Schedule a periodic block with that player in which you enqueue a mutable copy of your composition, if its currentItem is its last item.
When in doubt consult the AVFoundation Programming Guide