2013-11-08 3 views
4

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

for (NSString *myString in myArray) { 

    [self doSomethingToString:myString WithCompletion:^(BOOL completion) { 
     string = [NSString stringByAppendingString:@"Test"]; 
    }]; 

} 

Я хочу ждать предыдущей итерации, чтобы закончить, прежде чем начать на следующей. Как я могу пропустить какой-то блок-код?

+0

Эй, если вы нашли решение, то пожалуйста, напишите здесь, он будет помогать другим. –

+0

Если вы написали 'doSomethingToString: withCompletion:' просто измените этот метод, чтобы не делать что-то в другом потоке. – JeremyP

ответ

7

Попробуйте это

dispatch_semaphore_t sema = dispatch_semaphore_create(0); 

    for (NSString *myString in myArray) { 

     [self doSomethingToString:myString WithCompletion:^(BOOL completion) { 
      string = [NSString stringByAppendingString:@"Test"]; 
      dispatch_semaphore_signal(sema); 
     }]; 

     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 
     dispatch_release(sema); 

    } 
+3

+1 Это лучший строгий ответ на вопрос, но, конечно, это имеет эффект (как и все правильные ответы) на выполнение всех итераций в последовательности, как если бы в одном потоке, но с накладными расходами любой модели параллелизма плюс плюс вызовы семафора. – JeremyP

+0

dispatch_release (sema); не требуется для ARC. –

0

вы можете использовать

[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){ 
    string = [NSString stringByAppendingString:@"Test"]; 
}]; 
0

Swift 3,1

var sema = DispatchSemaphore(value: 0) 
for myString: String in myArray { 
    doSomething(to: myString, withCompletion: {(_ completion: Bool) -> Void in 
     string = String + ("Test") 
     dispatch_semaphore_signal(sema) 
    }) 
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER) 
    dispatch_release(sema) 
} 
Смежные вопросы