2014-01-06 4 views
3

Я не могу понять это, я учусь, когда я иду. У меня есть массив карт, которые я хочу переместить в заданное место. Это прекрасно работает, за исключением того, что все они сразу перемещаются. Я хочу, чтобы проверить, закончил ли первый переход до второго. Heres мой код до сих пор:Для цикла, до завершения внешнего метода

-(void)AIturn { 

int NuUnits = [p2Units count]; 
for (int q = 0; q < NuUnits; q++) 
    { 
    [self unselectUnit]; 
    selectedUnit = [p2Units objectAtIndex:q] ; 
    CGPoint moveto = CGPointMake(184,556); 
    TileData * td = [self getTileData:[self tileCoordForPosition:moveto]]; 
    //[selectedUnit doMarkedMovement:td ]; 
    [selectedUnit performSelector:@selector(doMarkedMovement:) withObject:td afterDelay:0.5]; 
    NSLog(@"%@ moved", selectedUnit); 
    } 

Итак, что В идеале я хочу, чтобы это знать, когда doMarkedMovement закончит делать свои вещи, а затем запустить через петлю снова.

Спасибо за любую помощь, которую вы можете предоставить.

+0

Have doMarkedMovement отправить уведомление, когда это сделано. –

ответ

1

У doMarkedMovement вызова метода, когда это сделано - давайте назовем его procNextMovement - и procNextMovement вызывает doMarkedMovement на следующий элемент в списке.

В качестве альтернативы, если это работает, было бы намного проще - измените параметр afterDelay. Поэтому, если каждый doMarkedMovement занимает 0,2 секунды, то ваши afterDelay s будут: 0,5, 0,7, 0,9, 1,1 и т. Д. Это было бы не так точно, как при использовании метода обратного вызова.

Что-то вроде этого:

- (void) AIturn { 
    upTo = 0; //has to be an instance variable 
    [self procNextTurn]; 
} 

- (void) procNextTurn { 
    if (upTo >= NuUnits) { 
     //done 
     return; 
    } 

    [self unselectUnit]; 
    selectedUnit = [p2Units objectAtIndex:upTo]; 
    CGPoint moveto = CGPointMake(184, 556); 
    TileData * td = [self getTileData:[self tileCoordForPosition:moveto]]; 
    upTo += 1 
    [selectedUnit performSelector:@selector(doMarkedMovement:) withObject:td afterDelay:0.5]; 
} 

Тогда в функцию selectedUnit «s:

- (void) doMarkedMovement:(id td) { 
    //regular code here 
    //callback once movement is done, where `caller` is whatever the object above was 
    [caller procNextTurn]; 
}   
+0

изменение «afterDelay» работает, но неуклюже. Карты приходят из разных мест, поэтому они не принимают одно и то же время. Я не понимаю, что вы подразумеваете под первым предложением. Извините, я все еще учась, когда я ухожу. Цикл for завершает весь прогон до того, как «DoMarkedMovement» заканчивается для первого, поэтому не будет вызывать другой метод, который вызывает его снова, просто перезапустите цикл for в 0? – lanerobertlane

+0

@ user3166360: А я имею в виду, оставьте цикл for. Вы не принимаете действия NuUnits сразу. Вы делаете одно действие, потом другое, потом другое и т. Д. Я напишу в некотором коде – Claudiu

+0

Это прекрасно работает сейчас. Спасибо – lanerobertlane

Смежные вопросы