2015-02-27 5 views
5

Im пишущий быстрый скрипт, который будет запущен в терминале, который отправляет в фоновый поток пару операций. Без каких-либо дополнительных усилий, после завершения моей отправки, код доходит до конца файла и завершает работу, также убивая мои фоновые операции. Каков наилучший способ сохранить быстрый скрипт до тех пор, пока мои фоновые операции не будут завершены?Ожидание асинхронных вызовов быстрым скриптом

Лучшее, что я придумал, это следующее, но я не верю, что это лучший способ или даже правильный.

var semaphores = [dispatch_semaphore_t]() 
while x { 
    var semaphore = dispatch_semaphore_create(0) 
    semaphores.append(semaphore) 
    dispatch_background { 
    //do lengthy operation 
    dispatch_semaphore_signal(semaphore) 
    } 
} 

for semaphore in semaphores { 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
} 
+1

Возможный дубликат [Несколько работников в Swift Command Line Tool] (http://stackoverflow.com/questions/28590701/multiple-workers-in-swift-command-line-tool) –

ответ

2

Благодаря Аарон Brager, который связан с Multiple workers in Swift Command Line Tool,

, который я использовал, чтобы найти свой ответ, используя dispatch_groups, чтобы решить эту проблему.

0

Как о чем-то вроде этого:

func runThingsInTheBackground() { 
    var semaphores = [dispatch_semaphore_t]() 

    for delay in [2, 3, 10, 7] { 
     var semaphore = dispatch_semaphore_create(0) 
     semaphores.append(semaphore) 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
      sleep(UInt32(delay)) 
      println("Task took \(delay) seconds") 

      dispatch_semaphore_signal(semaphore) 
     } 
    } 

    for semaphore in semaphores { 
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    } 
} 

Это очень похоже на то, что у вас есть. Моя работа «очередь» представляет собой набор секунд для сна, чтобы вы могли видеть, что все происходит в фоновом режиме.

Обратите внимание, что это просто выполняет все задачи в фоновом режиме. Если вы хотите ограничить количество активных задач, например, количеством ядер ЦП, вам нужно немного поработать.

Не уверен, что это то, что вы искали, сообщите мне.

+0

Возможно, мой вопрос был неясным, но это в точности то, что я написал выше. Спасибо за ваш пост, хотя! –

+0

Мой пример работает. Чего не хватает? Думаю, это отвечает на ваш вопрос? –

+0

Я уверен, что ваш код работает, но ваш код почти такой же, как у меня, и ничего не добавляет. –

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