For Loop Swift中的闭包完成

时间:2015-04-24 04:25:46

标签: ios swift for-loop closures

我有一组需要验证的对象。验证需要使用闭包。

我理解闭包可以随时完成,因此for循环将在所有闭包之前完成。因此,在for循环之后放置reloadData之类的东西是行不通的。

那么,对于已经完成循环的每个对象,知道何时完成所有闭包代码的好方法是什么?

我可以在闭包中调用reloadData,并且一次只能调用一次 - 但是一旦完成它们就更愿意这样做。

我的代码

    for aClient in passedPossible {

        let geocoder = CLGeocoder()
        geocoder.geocodeAddressString(aClient[address], completionHandler: { (placemarks, error) -> Void in
            if let placemarks = placemarks as? [CLPlacemark] {
                // found it do stuff
            }
            else {
                // do stuff as cannot find
            }
        })
    }

    // how to reload at the end of the for loop
    self.tableView.reloadData()

1 个答案:

答案 0 :(得分:1)

我建议对每个地理编码回调使用tableView.reloadRowsAtIndexPaths。

但是如果必须使用reloadData(),最简单的解决方法是计算地理编码作业以防止重入。

示例:

var loading =   false

@IBAction func
Do( sender: AnyObject ) {

    if !loading {
        loading = true
        var w = 0
        for i in 0 ..< 10 {
            dispatch_async( dispatch_get_main_queue() ) {
                println( i )
                if ++w == 10 {
                    self.loading = false
                    println( "It's time to call reloaddata!" )
                }
            }
        }
    }
}

编辑:

如何附加类似工作ID的内容并将其放入列表中?

var jobIDs: [ Int ] =   []

@IBAction func
Do( sender: AnyObject ) {

    if jobIDs.count == 0 {
        for theJobID in 0 ..< 10 {
            jobIDs.append( theJobID )
            dispatch_async( dispatch_get_main_queue() ) {
                println( "Doing job:\(theJobID)" )
                self.jobIDs.removeAtIndex( find( self.jobIDs, theJobID )! )
                if self.jobIDs.count == 0 {
                    println( "It's time to call reloaddata!" )
                }
            }
        }
    }
}

您可以使用'aClient'作为工作ID。