【发布时间】:2021-04-24 10:11:46
【问题描述】:
我的程序从 API 中提取数据以将约会数据返回到小部件中。我设置了一个闭包来处理从 API 中提取未知数量的页面。每次调用 loadResults 时,它都会查询 API,从第 1 页开始,然后检查是否还有任何页面,如果还有要拉取的页面,则再次调用自身。一旦 API 的所有页面都被拉取并加载到我的数组中,它就会停止运行。
我正在我的 getTimeline 函数中加载 getAllResults 函数,并希望等到它完成运行后再加载我的时间线条目。
有没有办法在 getAllResults 上放置一个可选的完成处理程序,这样我就可以在完成处理程序完成后使用这个函数来加载我的时间线条目?由于我多次调用它,我想让它递归运行直到完成,并能够提醒时间线它已完成并准备好加载。
当前代码:
func getAllResults(){
loadResults { (pageReturned) in
if pageReturned == Int(totalPages)! {
pages = 1
parseData(apptReturn: apptList)
//end the call
} else if pageReturned < Int(totalPages)! {
pages = pages + 1
getAllResults()
}
}
}
我在想这样的事情来命名完成处理程序并在嵌套闭包中调用它(但这不起作用)。有没有办法在 loadResults 闭包中引用 getAllResults 完成?
func getAllResults(completedResults completion: @escaping (Bool) -> ()){
loadResults { (pageReturned) in
if pageReturned == Int(totalPages)! {
pages = 1
parseTodayData(apptReturn: apptList)
getAllResults(completedResults: true) //error: Cannot convert value of type 'Bool' to expected argument type '(Bool) -> ()'
//end the call
} else if pageReturned < Int(totalPages)! {
pages = pages + 1
getAllResults(completedResults: false). //error: Cannot convert value of type 'Bool' to expected argument type '(Bool) -> ()'
//
}
//
}
}
【问题讨论】:
-
您不需要将某些内容传递给
loadResults以便加载下一页结果吗?否则,每次递归调用都会返回相同的结果集 -
没有。我有 API 默认检查 API 调用的第 1 页。它返回 API 结果,其中包括响应的页数(totalPages)。然后我将 1 添加到我刚刚检查的页面,然后如果还有剩余的页面,它也会一一调用。
-
另外,在 loadResults 函数中(我没有在这里详细展示)它会将每个 API JSON 返回到一个数组中。
标签: swift closures completionhandler