我正在使用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()
}
答案 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
!因此,需要进一步的细节。