Как вызвать метод после блока кода IBAction в Xcode

Я создал настольную игру для iPhone. У него есть возможность выбрать, хочет ли пользователь играть в многопользовательскую или одиночную игру.

Я использовал UIButton для фигур на доске.

У меня есть одна вещь, которую я хочу исправить: в режиме одиночной игры я реализовал поворот ИИ в UIButton IBAction. Но в этом случае нет времени между ходом player1 и player2. Оба выполняются одновременно.

Я бы хотел сделать это: Сделайте шаг человека незамедлительным, а затем компьютер продумает его ход. Я не хочу, чтобы оба хода совпадали, и после этого компьютер думает о переходе.

Я знаю, что проблема в том, что игра считывает весь блок кода в IBAction, а затем показывает результат, но я не знаю, как это исправить.

Любое предложение?

Если вам это нужно, я могу показать код, но я думаю (и я тоже надеюсь), что вы поймете, о чем я.

Из-за комментариев, которые запросили, вот код ..

- (void) buttonClickedSinglePlayer: (id) sender {

[self memorizzastatopartitapassato];
[self volumebottoni];
turno = [self whosTurn];
UIButton *bottoneCampoGioco = sender;
UIButton *bottoneIntelligente;

//Checks if it's Human's turn

if (turno == 0) {
    int valoreBottone = [bottoneCampoGioco.currentTitle intValue];
    if(valoreBottone< 10){

        //if controls are ok, it changes value of human's chosen button

        if((bottoneCampoGioco.currentTitleColor != [UIColor greenColor])){
            [UIView transitionWithView:bottoneCampoGioco duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft animations:nil completion:nil];
            [bottoneCampoGioco setTitleColor:[UIColor redColor] forState: UIControlStateNormal];
            [bottoneCampoGioco setTitleColor:[UIColor redColor] forState: UIControlStateHighlighted];
            bottoneCampoGioco.titleLabel.shadowColor = [UIColor blackColor];
            [bottoneCampoGioco.titleLabel setShadowOffset:CGSizeMake(1.0f, 1.0f)];                [bottoneCampoGioco setBackgroundImage: [UIImage imageNamed:@"bottonerosso.png"] forState:UIControlStateNormal];

            [self incrementaTitoloOnClick :bottoneCampoGioco];
        }

        //else alert and loop to first line of the code, until he chooses a valid move
        else {
            [self posizionenonconsentita];
            turno = [self whosTurn];
            goto end;
        }
    }
    else{
        int x =[self mossedisponibilirosse];
        if (x== 1) {

            [self analizzavincitore];
        }

            [self numeroMax];
        turno = [self whosTurn];
        goto end;
    }


    turno = 1;
    [self analizzaBottoni:bottoneCampoGioco];
    [self aggiornapunteggi];
    [self memorizzastatopresente];

pragma mark Действия одного игрока

    //Azione del giocatore singolo

    //changes turn token's value to allow to AI to play

    turno = [self whosTurn];
    turno = 0;

    ai = [[ArtificialIntelligence alloc]init];

    //send to AI's class the human's pressed button


    [ai setbottonepremuto:bottoneCampoGioco];
    [ai setDimensioneInput:dimensioneInput];

    //send the situation of the board

    [ai setSituazione:arraycampogioco];
    [ai setpunteggiogiocatori:volumerossi giocatoree2:volumeverdi];

    //get back the chosen button from ai's class
    bottoneIntelligente=[ai bottone];
    [mossaEffettuata setText:[self stringaCoordinateDaBottone:bottoneIntelligente]];
    int valoreBottone2 = [bottoneIntelligente.currentTitle intValue];

    //then changes the value of the button chosen from ai's class

    if(valoreBottone2< 10){

        [UIView transitionWithView:bottoneIntelligente duration:0.3 options:UIViewAnimationOptionTransitionFlipFromTop animations:nil completion:nil];
        [bottoneIntelligente setTitleColor:[UIColor greenColor] forState: UIControlStateNormal];
        [bottoneIntelligente setTitleColor:[UIColor greenColor] forState: UIControlStateHighlighted];
        bottoneIntelligente.titleLabel.shadowColor = [UIColor blackColor];
        [bottoneIntelligente.titleLabel setShadowOffset:CGSizeMake(1.0f, 1.0f)];
        [bottoneIntelligente setBackgroundImage: [UIImage imageNamed:@"bottoneverde.png"] forState:UIControlStateNormal];

        [self incrementaTitoloOnClick :bottoneIntelligente];
        [self analizzaBottoni:bottoneIntelligente];
        [self aggiornapunteggi];

    }

end:

    turno = [self whosTurn];
}
turno = [self whosTurn];
numeromosse ++;

}


person Bellots    schedule 09.04.2013    source источник
comment
Да, в этой версии я сохраняю ход (игрока 1), а затем передаю его другому классу, который вычисляет ход (игрока 2).   -  person Bellots    schedule 09.04.2013
comment
Внутри кода IBAction он анализирует ход Человека и сразу после этого вычисляет ход ИИ. Проблема в том, что даже если я добавлю таймер между двумя ходами, он объединит все вместе в конце блока IBAction. В ViewDidLoad я вызвал метод, который создает полевую игру, внутри этого метода я добавляю IBAction к каждой кнопке ... я не знаю, как я могу вызвать отдельно метод ai.   -  person Bellots    schedule 09.04.2013
comment
Теперь, наверное, пора добавить код :)   -  person viral    schedule 09.04.2013


Ответы (1)


Если я правильно понял, вы хотите выполнить раздел кода AI после задержки. Если вы можете преобразовать код в другой метод, вы можете использовать performSelector:withObject:afterDelay:, который будет выглядеть так:

[self performSelector:@selector(aiMove) withObject:nil afterDelay:2.0];

Это запустит метод через 2 секунды. Или вы можете использовать dispatch_after GCD, который выглядит так (ниже). Поместите код, который вы хотите запустить после задержки, в блок.

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

 // 
 //Your code goes here
 //

 });
person Jai Govindani    schedule 09.04.2013
comment
Мне не нужно ждать 2 или более секунды, потому что расчет AI занимает около 0,5 секунды. мне нужно, чтобы Человек выбирал ход через блочный код IBAction, и только когда он заканчивает, он начинает вычислять ход ИИ ... Надеюсь, вас можно понять .. :( - person Bellots; 09.04.2013
comment
Вы имеете в виду, что хотите дождаться завершения выполнения определенного блока кода, а ЗАТЕМ выполнить ИИ? Если это так, вам, вероятно, следует разделить два метода, а затем использовать обратный вызов для запуска второго метода после завершения первого. В качестве взлома вы можете попробовать performSelectorOnMainThread:withObject:waitUntilDone: - вам все равно нужно разделить код на другой метод, и это заблокирует основной поток до тех пор, пока код не будет выполнен (пользователь сделал ход). - person Jai Govindani; 09.04.2013
comment
вот что мне нужно, я думаю !! сегодня попробую воспользоваться обратным вызовом, а потом напишу еще один комментарий, нормально это или нет;) спасибо !!! - person Bellots; 09.04.2013
comment
Мне пришлось записать ходы двумя разными способами, я связал их с [self performSelector:@selector(aiMove) withObject:nil afterDelay:2.0];, и он отлично работает !!! большое спасибо!!!! - person Bellots; 09.04.2013