我正在使用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
!同样,还需要更多细节。