第二次调用函数时未调用 Swift 完成处理程序
Posted
技术标签:
【中文标题】第二次调用函数时未调用 Swift 完成处理程序【英文标题】:Swift Completion Handler Not Called on Second Call to Function 【发布时间】:2017-11-28 03:39:33 【问题描述】:我有一个带有完成处理程序的 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()
,完成处理程序会以某种方式失效,并且永远不会返回到我原来的myMainFunction()
。
有什么想法吗?
【问题讨论】:
【参考方案1】:如果 offset 不为空,您将传递空闭包。您需要再次将完成参数转发给 getTasks。试试这个。
//...
if !offset.isEmpty
getTasks(project: project, paginationToken: offset, completion: completion)
//...
【讨论】:
哦,我明白了。所以本质上它是在跟踪原始的完成处理程序。我通过在后续函数调用中传递一个空白值来删除它。说得通。谢谢! :)以上是关于第二次调用函数时未调用 Swift 完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章
SKScene touchesEnded 第二次呈现场景时未调用
从 Timer 选择器函数 Swift 调用函数的完成处理程序
进行第二次 Json 调用 Swift 3 后如何在 UITableview 中重新加载数据