调用函数并从Swift中的闭包内传递参数

时间:2015-08-17 18:06:36

标签: swift closures

我正在使用NSURLSession执行HTTP请求,这需要一个将在请求结束时执行的闭包。在闭包内,我试图调用一个函数并将returnList对象传递给该函数。

问题:当我使用callback()函数打印出列表时,它是空的,即使我已经为闭包内的列表对象分配了一个值。这种行为的原因是什么?我需要做什么才能将对象传递给在闭包内调用的函数?

var returnList = [ReturnList]()
    ...
    ...
    func httpRequestFunction(callback: ([ReturnList])->()){
    let task = NSURLSession.sharedSession().dataTaskWithURL(url){(data, response, error)  in

                if error != nil {
                    //TODO do some error handling
                    return
                }


                var xmlUtil = XMLUtil(data: data)
                self.returnList = xmlUtil.parseXML()
                println(self.returnList.count) // returns 1
                callback(self.returnList) /*the callback prints returnList.count which is then 0 */


            }

            task.resume()
     }

1 个答案:

答案 0 :(得分:1)

您所描述的内容并不正常,因此必须继续进行其他操作。例如:

typealias ReturnList = Int
var returnList = [ReturnList]()
func httpRequestFunction(callback: ([ReturnList])->()) {
    self.returnList = [1,2,3]
    print(self.returnList.count) // prints 3
    callback(self.returnList) // prints 3
}
func test() {
    httpRequestFunction {
        list in
        print(list.count)
    }
}

完美无缺。由于这不是你得到的那种结果,你必须做出其他错误的事情 - 但由于你拒绝再显示任何代码,因此无法知道它是什么。 / p>

例如,您 callback打印returnList.count,但当然最好不要打印self.returnList.count - 它需要打印计数列出它作为参数(如上例所示)。但是你拒绝展示它,那么我怎么知道你做得对呢?等等。

另一个困难来源是您正在从HTTP回调中访问实例变量self.returnList。那么谁知道我们在做什么线程?如果在后台线程上发生这种情况,可能会出现其他一些线程,并在我们self.returnList和我们在下一行中调用print的时间之间更改callback!因此,需要进一步的细节。

相关问题