Best way to refactor this loop of animations with delay? I have some animations happening after some delay calls the code to animate.  It works fine, but the code to call the functions is not nice.

    double delayInSeconds = 0.2;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.1 * NSEC_PER_SEC);
    dispatch_time_t popTime2 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.2 * NSEC_PER_SEC);
    dispatch_time_t popTime3 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.3 * NSEC_PER_SEC);
    dispatch_time_t popTime4 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.4 * NSEC_PER_SEC);
    dispatch_time_t popTime5 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.5 * NSEC_PER_SEC);
    dispatch_time_t popTime6 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.6 * NSEC_PER_SEC);
    dispatch_time_t popTime7 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.7 * NSEC_PER_SEC);
    dispatch_time_t popTime8 = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds + 0.8 * NSEC_PER_SEC);

    if (self.menuType == kRacingMenu) {

        self.menuAnimationSequence = @[@0, @1, @3, @2, @4]; //animation sequence!

        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:0];
        });
        dispatch_after(popTime2, dispatch_get_main_queue(), ^(void){
        [self animateWithCoreAnimaGenerallyWithIndex:1];
        });
        dispatch_after(popTime3, dispatch_get_main_queue(), ^(void){
        [self animateWithCoreAnimaGenerallyWithIndex:2];
        });
        dispatch_after(popTime4, dispatch_get_main_queue(), ^(void){
        [self animateWithCoreAnimaGenerallyWithIndex:4];
        });
        dispatch_after(popTime5, dispatch_get_main_queue(), ^(void){
        [self animateWithCoreAnimaGenerallyWithIndex:3];
        });


    }else if (self.menuType == kLoginMenu) {
        self.menuAnimationSequence = @[@0, @1, @3, @2]; //animation sequence!
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:0];
        });
        dispatch_after(popTime2, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:1];
        });
        dispatch_after(popTime3, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:2];
        });
        dispatch_after(popTime4, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:3];
        });


    } else {
        [self animateWithCoreAnimaGenerallyWithIndex:1];
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:0];
        });
        dispatch_after(popTime2, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:2];
        });
        dispatch_after(popTime3, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:4];
        });
        dispatch_after(popTime4, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:3];
        });
        dispatch_after(popTime5, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:5];
        });
        dispatch_after(popTime6, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:7];
        });
        dispatch_after(popTime7, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:6];
        });
        dispatch_after(popTime8, dispatch_get_main_queue(), ^(void){
            [self animateWithCoreAnimaGenerallyWithIndex:8];
        });

    }


How best to abstract this timer?  And the calls to start the animation?
Anything that you're using as a constant should be marked as such.  

double const delayInSeconds = 0.2f;




Now then, we know in Objective-C, we have NSArray and its mutable cousin, and they can only hold objects.  But also remember, Objective-C is a superset of C.  We can use a C-Style array.

int const POPTIME_COUNT = 8;

dispatch_time_t poptime[POPTIME_COUNT];


And then fill this an array with a loop...

for (int i = 0; i &lt; POPTIME_COUNT; ++i) {
    double totalDelay = delayInSeconds + ((i + 1) * 0.1 * NSEC_PER_SEC)                
    poptime[i] = dispatch_time(DISPATCH_TIME_NOW, totalDelay);
}




Firing off the animations is done just as easily in a loop:

for (int i = 0; i &lt; NUM_ANIMATIONS; ++i) {
    dispatch_after(poptime[i], dispatch_get_main_queue()), ^(void){
        [self animateWithCoreAnimaGenerallyWithIndex:i];
    }];
}


Where NUM_ANIMATIONS is the number of animations you need to fire off (it's different in each branch).