在嵌套闭包中调用完成处理程序以停止递归函数
Calling completion handler within nested closure to stop recursive function
我的程序将 API 到 return 的约会数据提取到小部件中。我设置了一个闭包来处理从 API 中提取未知数量的页面。每次调用 loadResults 时,它都会查询 API,从第 1 页开始,然后检查是否还有剩余页面,如果还有剩余页面需要拉取,则会再次调用自身。一旦 API 的所有页面都被拉入并加载到我的数组中,它就会停止 运行ning.
我正在我的 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) -> ()'
//
}
//
}
}
无论您是否需要递归,对于异步调用,您都需要一个完成处理程序,以便调用者可以知道操作何时完成。
如果要使用递归,可以将完成处理程序传递给下一个递归调用,并在完成时调用它。
func getResults(onCompleted handler: @escaping () -> Void) {
loadResults { pageReturned in
let needToLoadMore = ... // determine if you need to load more pages
// other side effects
if needToLoadMore {
getResults(onCompleted: handler)
} else {
handler()
}
}
}
我的程序将 API 到 return 的约会数据提取到小部件中。我设置了一个闭包来处理从 API 中提取未知数量的页面。每次调用 loadResults 时,它都会查询 API,从第 1 页开始,然后检查是否还有剩余页面,如果还有剩余页面需要拉取,则会再次调用自身。一旦 API 的所有页面都被拉入并加载到我的数组中,它就会停止 运行ning.
我正在我的 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) -> ()'
//
}
//
}
}
无论您是否需要递归,对于异步调用,您都需要一个完成处理程序,以便调用者可以知道操作何时完成。
如果要使用递归,可以将完成处理程序传递给下一个递归调用,并在完成时调用它。
func getResults(onCompleted handler: @escaping () -> Void) {
loadResults { pageReturned in
let needToLoadMore = ... // determine if you need to load more pages
// other side effects
if needToLoadMore {
getResults(onCompleted: handler)
} else {
handler()
}
}
}