在 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
!因此,需要进一步的详细信息。
我正在使用 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
!因此,需要进一步的详细信息。