Как сделать эту функцию блокировки обратного вызова?

for (NSObject *aObj in myObjectArray) {
   [self doSomething:aObj
      completion:^{
      //Execute next aObj
   }];
}

Вот простой цикл for-in, который выводит NSObject, после чего принимает aObj для перехода к doSomething, но doSomething имеет параметр, который является завершением, который является блоком... Проблема, с которой я столкнулся is....Следующий aObj должен быть вызван до завершения предыдущего aObj. И, после того как все aObj закончено в myObjectArray закончено. Это закончится. Но что я должен писать в блоках завершения? Я в замешательстве.

Имитация костюма:

  1. Если у myObjectArray есть следующие aObj
  2. myObjectArray возьми aObj
  3. self звонит doSomething
  4. когда selfdoSomething` завершится, будет выполнен код завершения, возврат к шагу 1.

person DNB5brims    schedule 30.11.2013    source источник


Ответы (2)


Было неясно (до вашего комментария к ответу DrummerB), что вам действительно нужна последовательная работа, а не параллельная - это не нормально, что цикл используется для последовательной работы, но в другом потоке (хотя я полагаю, вы хотите выйти основная нить для вашей тяжелой обработки).

Это можно сделать с помощью NSOperationQueue:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
for (__block NSObject *aObj in myObjectArray) {
    [queue addOperationWithBlock:^{
        [self doSomething:aObj
            completion:^{
               // nothing special here, since we wait after the operation is queued
             }];
    }];
    [queue waitUntilAllOperationsAreFinished];
}

Обратите внимание, что я добавил ключевое слово __block к aObj — потенциально необходимое, поскольку вы передаете его в блок.

person mah    schedule 30.11.2013

NSArray имеет метод enumerateObjectsWithOptions:usingBlock:, который позволяет указать параметр для одновременного выполнения блока для каждого объекта. Может быть, это то, что вы ищете.

[array enumerateObjectsWithOptions:NSEnumerationConcurrent 
                        usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [self doSomething:obj];
    // completion
}];
person DrummerB    schedule 30.11.2013
comment
Милая! Я работал над простым (?) Примером NSOperationQueue, но поскольку NSArray обрабатывает его, так все намного лучше! - person mah; 30.11.2013
comment
Но проблема, которую я получил, заключается в том, что следующий aObj ДОЛЖЕН нуждаться в том, чтобы предыдущий aObj был завершен, что вызовет блок завершения. Я обновляю вопрос, чтобы уточнить мой вопрос. - person DNB5brims; 30.11.2013