我想超時並在5秒內跳出此循環。我只能在網上找到的東西是每秒都有一個計數變量遞增,然後打破計數爲5的情況,但是想知道是否有更簡單,更少更復雜的方式。請幫忙!在Swift中5秒後跳出while循環
locationManager.startUpdatingLocation()
while (locationManager.location == nil) {
//searching...
}
locationManager.stopUpdatingLocation()
我想超時並在5秒內跳出此循環。我只能在網上找到的東西是每秒都有一個計數變量遞增,然後打破計數爲5的情況,但是想知道是否有更簡單,更少更復雜的方式。請幫忙!在Swift中5秒後跳出while循環
locationManager.startUpdatingLocation()
while (locationManager.location == nil) {
//searching...
}
locationManager.stopUpdatingLocation()
有一個while循環的問題是,如果它在主線程上,它將阻止用戶使用該應用程序。您應該開始更新位置,然後使用GCD(假設您在OSX上; GCD在Linux上尚未提供)在五秒鐘內運行以禁用位置管理器,從而開始更新位置並安排後臺線程。您也可以安排它在一秒鐘內運行,檢查它是否存在,然後再次嘗試或讓它運行五秒鐘。
您可以創建這樣一個延時功能:
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), closure)
}
和使用它像這樣經過:
delay(5){
locationManager.location = //something different from nil or you can try with break sentence ; not sure if with break will work though .
}
你可以每次運行測量進入循環之前的當前時間,再次循環。將實際值與開始時的值進行比較,如果差值大於5秒,則斷開。這只是你要求的直接答案。但是,@ AlBlue的答案如下,你應該在iOS上做什麼。 –
...或其他阻塞主線程的系統意味着阻塞圖形用戶界面。 –
沒有什麼比「更少更復雜」。最重要的指標是「正確」和「更具可讀性」。以這種方式完成的無限循環首先是錯誤的。時間限制不會改善他們。 – Sulthan