2013-11-30 4 views
0
for (NSObject *aObj in myObjectArray) { 
    [self doSomething:aObj 
     completion:^{ 
     //Execute next aObj 
    }]; 
} 

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

Simulate suitation:

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

ответ

1

Это не было ясно (пока ваш комментарий на ответ 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 - потенциально необходимое, так как вы передаете, что в блок.

1

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

[array enumerateObjectsWithOptions:NSEnumerationConcurrent 
         usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    [self doSomething:obj]; 
    // completion 
}]; 
+0

Sweet! Я работал над простым (?) NSOperationQueue примером, но поскольку 'NSArray' обрабатывает его, все намного лучше! – mah

+0

Но проблема у меня есть ... следующий 'aObj' ДОЛЖЕН нуждаться в том, чтобы предыдущий' aObj' был завершен, который перезвонит блок завершения. Я уточняю вопрос, чтобы уточнить мой вопрос. – DNB5brims