2015-09-24 9 views
-1

В Swift (это Swift) существует целый ряд способов для обработки асинхронно,Ждать в цикле (в любом случае, в любом случае) в Swift?

Скажем у вас есть цикл, как это - это вызов кода вызова синтаксического анализа облако, которое идет на фоне все равно.

public func runImages() 
    { 
    print("test begins...") 
    for i in 1...3 
     { 
     print("Tick tock tick tock ..\(i)") 
     PFCloud.callFunctionInBackground("blah", withParameters:["bla":i,"bla":"bla]) 
     { 
     (response: AnyObject?, error: NSError?) -> Void in 
      print(".. done! Now go again...") 
      if let rr = response as? String { print(rr) } 
      if let err = error { print(err.domain) } 
     } 
     } 
    } 

Как сделать так, чтобы подождать конца каждого вызова PFCloud?

Действительно ли обычный флаг лучше всего, или? (Обратите внимание, что (a) я не могу получить флаг для работы в Swift и (b), поскольку Павел указывает, что вы блокируете интерфейс!)

Что такое «Быстрый способ» в контексте вас см. здесь? Я считаю, что было бы очень нецелесообразно использовать рекурсивный шаблон здесь, например.

+0

Не ждите. Просто выполните код, который вы хотите в закрытии. Если вы хотите, чтобы функции облачного кода выполнялись серийно, вам нужно отправить их в очередь последовательной отправки и использовать 'callFunctuon', а не' callFunctionInBackground' – Paulw11

+0

Hi Paul - приведенный выше код будет запускать все три вызова одновременно (синхронно) , Часто вы не хотите этого: вы хотите, чтобы они запускались один за другим. Один начинается только тогда, когда заканчивается другой. – Fattie

+0

Вы можете использовать 'dispatch_barrier_async' в очереди последовательной отправки, если вы хотите отправить блок, который будет выполняться после завершения всех трех методов. – Paulw11

ответ

2

Если вы хотите, три вызова, чтобы выполнить последовательно, то вы можете использовать последовательную очередь отправки и dispatch_barrier_async сделать что-то, когда все три закончены -

let dispatchQueue=dispatch_queue_create("queue", DISPATCH_QUEUE_SERIAL) 

for i in 1...3 { 
    dispatch_async(dispatchQueue, {() -> Void in 
     print("i=\(i)") 
     let result = PFCloud.callFunction("blah", withParameters:["bla":i,"bla":"bla]) 
    }) 
} 

dispatch_barrier_async(dispatchQueue, {() -> Void in 
    print("really done") 
}) 

print(" done") 

Для того, чтобы это работало с функцией синтаксического разбора вам нужно использовать синхронный вызов облачного кода, а не асинхронный. И если вы обновите UI в закрытии dispatch_barrier_async, вам нужно будет отправить его в основную очередь.

+0

спасибо за фантастический пример кода, в Swift, фантастический. Я бы тоже хотел найти способ сделать это, используя обычные фоновые звонки синтаксического анализа .. Я все еще смотрю! – Fattie

+0

Вы не можете использовать фоновые вызовы Parse, потому что вы не можете синхронизировать, потому что у вас есть «потерянный контроль» – Paulw11

+0

Я думаю, я не должен сказать «не могу», а скорее «не должен», так как вам нужно спроектировать решение для синхронизации, которое GCD может дать вам «бесплатно» – Paulw11

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