我正在使用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。那么谁知道我们在哪个线程上呢?如果这是在后台线程上发生的,则可能会有其他线程在我们self.returnList的时间与在下一行中调用print的时间之间更改callback!同样,还需要更多细节。

09-17 07:35