Search code examples
iphoneiostimeselectordelay

how can i perform selector after time without AfterDelay ?! (code unside)


first of all thanks for getting into my questions. now, i tried a lot of different ways to call some function in my code but the ways i find it works (performselector:withobject:afterdelay) are get into the function immediately and i need the function to make some "if's" after random times. Well you can see the code in here-

-(void)playGame{
    isButtonPressed=NO;

    int minimum=1;
    int maximum=4;
    int randomTime=(arc4random()%(maximum-minimum))+minimum;
    [self performSelector:@selector(ifButtonNotPressed) withObject:nil afterDelay:randomTime];
}

-(void)closingAction{
    NSLog(@"Closing Panel automatic");
    if (randomFrog==1){
        [self performSelector:@selector(animatePanelCloseAction::) withObject:gameImage1_up withObject:gameImage1_down];
    }
    [self performSelector:@selector(playGame) withObject:nil afterDelay:0.25];
}


-(IBAction)buttonAction:(id)sender{

    if (sender == gameButton1 && randomFrog==1){
        [self performSelector:@selector(disableAllButtons)];
        score=score+1;
        isButtonPressed=YES;
        [scoreLabel setText:[NSString stringWithFormat:@"Score:%d",score]]; 
        [self performSelector:@selector(closingAction)];
    }
}

-(void)ifButtonNotPressed{
    if (isButtonPressed==NO){
        [self performSelector:@selector(closingAction)];  
    }
}

as you can see, im trying to check if button was pressed, but its going inside and check it immeditlly and perform it after delay.

how can i call it after real delay ?!

thank you all. amir.


Solution

  • Try NSTimer to fix this issue.

    if(callTimer)
    {
       [callTimer invalidate];
       callTimer=nil;
    }
     callTimer=[NSTimer scheduledTimerWithTimeInterval:0.50 target:self selector:@selector(callFunction) userInfo:nil repeats:NO];
    

    with help of this you can call any function at particular time interval. if function call again then it invalidates current timer and create new timer for that.

    Dont forgot to invalidate timer after calling function means invalidate timer in particular function.