我必须将一些名称下载到一个数组中,但我不确切知道将下载多少名称。只有在下载了所有名称后,我才需要运行自定义功能。
我使用了一个闭包来调用自定义函数但是一旦下载了第一个名字,我的自定义函数被立即调用,然后下载第二个名字,然后再次调用自定义函数等等。
我需要在将所有名称下载到数组后才调用自定义函数,而不是在下载每个名称后调用。我在哪里做错了什么?
这就是我得到的:
Mable
This should only print once not three times
Marlene
This should only print once not three times
Moses
This should only print once not three times
这就是我想要的:
Mable
Marlene
Moses
This should only print once not three times
如果可能的话,我希望在里面解决这个问题:addAllNamesToArrayThenRunClosure
代码:
//There actually can be 1 or 100 names but I just used 3 for the example
var randomNames = ["Mable", "Marlene", "Moses"]
var nameArray = [String]()
func addAllNamesToArrayThenRunClosure(name: String, completionHandler: (success:Bool)->()){
nameArray.append(name)
print(name)
let flag = true
completionHandler(success:flag)
}
func customFunction(){
print("This should only print once not three times")
}
for name in randomNames{
addAllNamesToArrayThenRunClosure(name){
//Shouldn't this run only after the array is filled?
(success) in
if success == true{
customFunction()
}
}
}
答案 0 :(得分:1)
addAllNamesToArrayThenRunClosure
实际上只添加一个名称,并且每个名称都会调用一次。如果您在那里调用完成处理程序,则每个名称都会调用一次。您需要重新设计它,以便在添加所有名称后调用闭包。
这是我将如何做到的:
//There actually can be 1 or 100 names but I just used 3 for the example
var randomNames = ["Mable", "Marlene", "Moses"]
var globalNames = [String]()
func add(names: [String], completionHandler: ( _ success: Bool) -> Void) {
globalNames.append(contentsOf: names)
completionHandler(true)
}
add(names: randomNames) { success in
if success {
print("Finished")
}
}
答案 1 :(得分:1)
我建议在for
方法中添加addAllNamesToArrayThenRunClosure
循环。然后,您可以在添加所有名称后调用完成处理程序。
var randomNames = ["Mable", "Marlene", "Moses"]
var nameArray = [String]()
func addAllNamesToArrayThenRunClosure(completionHandler: (success: Bool) -> ()) {
for name in randomNames {
nameArray.append(name)
}
completionHandler(true)
}
然后,从完成处理程序中调用您的自定义函数,如下所示:
addAllNamesToArrayThenRunClosure() { success in
self.customFunction()
}