[英]My Completion Handler for a Swift App Doesn't Seem to Work
我正在使用此處找到的方法將街道地址轉換為坐標點。 我的完成處理程序成功后,應該將坐標點添加到我已經初始化的列表中,但是當我進入調試模式時,完成處理程序被完全忽略,導致索引超出范圍錯誤。 我想我的完成處理程序有問題,可以在下面找到:
func setUp() {
for a in addresses {
print(a)
getCoordinate(address: a, completionHandler: {coord , error in
if error == nil {
items.append(Location(coordinate: CLLocationCoordinate2D(latitude: coord.latitude, longitude: coord.longitude), address: a))
print("resulting coordinate = (\(coord.latitude),\(coord.longitude))")
} else {
print(error as Any)
}
})
}
}
總而言之,當我去調試這個問題時,調試器會到達代碼片段中的第 4 行,然后跳過函數的其余部分。 謝謝你的幫助!
這就是異步代碼的工作原理。 您進行調用,並將其傳遞給完成處理程序。 函數調用立即返回。 在未來的某個日期, aysnc 函數完成其工作,然后調用您的完成處理程序。
把它想象成讓你的孩子跑到商店買一些你完成晚餐所需的原料。 你把清單發給你的孩子,讓他們在路上,然后回去做剩下的晚餐。 當他們回來時,經過不可預知的延遲,他們告訴你他們有東西(調用你的完成處理程序),然后你拿走他們給你的項目(你的完成處理程序可以從異步函數中獲取參數。)
如果您在完成處理程序中、在函數調用中以及在函數調用之后設置斷點,您將看到調試器首先命中函數調用,然后是函數調用后斷點,然后在以后的某個時間將看到它擊中完成處理程序代碼的斷點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.