2017-04-06 46 views
0

我有一個在for循環中異步執行的閉包。如何在Swift中連續執行閉包

for i in 0..<10 { 
    closure 
} 

如何使for循環等待才能進入下一個迭代要執行的關閉?

+3

你應該提供關閉。閉包被執行同步。閉包內的代碼很可能不是以同步方式執行的。另外,你怎麼知道這是不是同步執行? –

+0

該API說它是異步的,再加上我在封閉內部打印了一些行 – Carpsen90

+0

您能否指點我說的文檔,它說閉包不被執行同步?如果是這樣,我真的很好奇。 –

回答

0

您可以將它們添加到OperationQueue並將其maxConcurrentOperationCount設置爲1.然後運行它們。

+0

你能說明如何將這些內容寫入for循環嗎? – Carpsen90

1

你可能想要使用NSOpertations或GCD。請參閱Dispatch 或者如果您正在做很多事情,則可以使用PromiseKit

0

你可以用Dispatch做到這一點很乾脆:

import Dispatch // Necessary for DispatchQueue 
import Foundation // Necessary for sleep 

let closures = [ //The array of closures to execute serially 
    { print(1); sleep(1) }, 
    { print(2); sleep(1) }, 
    { print(3); sleep(1) }, 
    { print(4); sleep(1) }, 
    { print(5); sleep(1) } 
] 

let queue = DispatchQueue(label: "My Serial Queue") // TODO: Name me 

for closure in closures { 
    queue.sync(execute: closure) 
} 

// Alternatively: 
// closures.forEach(queue.sync(execute:)) 
+0

該隊列可以作爲主隊列嗎? – Carpsen90

+0

@ Carpsen90如果你願意,當然。請記住,這意味着您的關閉不一定會連續運行(其他工作項目可以在您的之間執行) – Alexander

+0

因此,在for循環中,我可以使用'DispatchQueue.main.sync'? – Carpsen90

1

這是馬克斯試圖說:

var queue = OperationQueue() 

queue.maxConcurrentOperationCount = 1 

for i in 0..<10 { 
    queue.addOperation { 
     // closure here 
    } 
} 
+1

在答案中有多樣性是很好的,但我會親自避免使用'OperationQueue'。 GCD是一個更普遍,更新,更廣泛使用的API。 – Alexander

+0

@Alexander沒關係,它做同樣的事情。這是一個風格問題。 – pableiros