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

Calling a function and passing parameters from within a closure in Swift

我正在使用 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()
     }

您所描述的情况不正常,因此一定有其他原因。例如:

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

效果很好。由于这不是您得到的那种结果,您一定是做错了什么 - 但没有办法知道它是什么,因为您拒绝显示更多代码。

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

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