Swift 第二次调用函数时未调用完成处理程序
Swift Completion Handler Not Called on Second Call to Function
我有一个带有完成处理程序的 Swift 函数,我想在某个网络请求完成时调用它。如果服务器响应表明有更多数据(提供 offset
),可以重复网络请求。
我最初是这样称呼它的:
func myMainFunction(){
getTasks(project: project, paginationToken: nil) {
print("This never fires...")
}
}
而我的 getTasks()
函数是这样的:
func getTasks(project: Project, paginationToken: String?, completion: @escaping () -> Void){
var url = "..."
if let token = paginationToken{
url += "&offset=\(token)"
}
Alamofire.request(url).responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
//...
//Check for pagination
let offset = json["next_page"]["offset"].stringValue
if !offset.isEmpty{
//Theres a pagination token available, go again!
getTasks(project: project, paginationToken: offset){}
}else{
print("This prints to the log on the last run through")
completion()
}
case .failure(let error):
print("Task error: \(error)")
}
}
}
如果从来没有 offset
那么 completion()
处理程序工作正常。但是如果 getTasks()
必须再次调用,完成处理程序会以某种方式失效并且永远不会 returns 到我原来的 myMainFunction()
.
有什么想法吗?
如果 offset 不为空,则传递的是空闭包。您需要再次将完成参数转发给 getTasks。试试这个。
//...
if !offset.isEmpty {
getTasks(project: project, paginationToken: offset, completion: completion)
}
//...
我有一个带有完成处理程序的 Swift 函数,我想在某个网络请求完成时调用它。如果服务器响应表明有更多数据(提供 offset
),可以重复网络请求。
我最初是这样称呼它的:
func myMainFunction(){
getTasks(project: project, paginationToken: nil) {
print("This never fires...")
}
}
而我的 getTasks()
函数是这样的:
func getTasks(project: Project, paginationToken: String?, completion: @escaping () -> Void){
var url = "..."
if let token = paginationToken{
url += "&offset=\(token)"
}
Alamofire.request(url).responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
//...
//Check for pagination
let offset = json["next_page"]["offset"].stringValue
if !offset.isEmpty{
//Theres a pagination token available, go again!
getTasks(project: project, paginationToken: offset){}
}else{
print("This prints to the log on the last run through")
completion()
}
case .failure(let error):
print("Task error: \(error)")
}
}
}
如果从来没有 offset
那么 completion()
处理程序工作正常。但是如果 getTasks()
必须再次调用,完成处理程序会以某种方式失效并且永远不会 returns 到我原来的 myMainFunction()
.
有什么想法吗?
如果 offset 不为空,则传递的是空闭包。您需要再次将完成参数转发给 getTasks。试试这个。
//...
if !offset.isEmpty {
getTasks(project: project, paginationToken: offset, completion: completion)
}
//...