快速关闭表达

时间:2016-11-16 19:54:13

标签: arrays swift callback closures

我必须将一些名称下载到一个数组中,但我不确切知道将下载多少名称。只有在下载了所有名称后,我才需要运行自定义功能。

我使用了一个闭包来调用自定义函数但是一旦下载了第一个名字,我的自定义函数被立即调用,然后下载第二个名字,然后再次调用自定义函数等等。

我需要在将所有名称下载到数组后才调用自定义函数,而不是在下载每个名称后调用。我在哪里做错了什么?

这就是我得到的:

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()
      }
    }
}

2 个答案:

答案 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()
}