在開始我正在從事的專案之前,我過去已經對此進行了廣泛的測驗。我將代碼復制并粘貼到我的新專案中,所以它應該可以作業。我想做的就是每分鐘重新加載一次 tableView,以便重新加載 tableView 上顯示的時鐘。
func setMinutesForReload(){
//get calender object
let calender = Calendar.current
//curent date
let now = Date()
//create an array of dates to store minutes
var minutes = [Date]()
//timer array to store timers
var timers = [Timer]()
//set a run loop
for i in 0...23{
for j in 0...59{
minutes.append(calender.date(bySettingHour: i, minute: j, second: 0, of: now)!)
timers.append(Timer(fireAt: minutes[j], interval: 0, target: self, selector: #selector(minutelyReloadTimer), userInfo: nil, repeats: false))
RunLoop.main.add(timers[j], forMode: RunLoop.Mode.common)
}
}
}
@objc func minutelyReloadTimer(){
self.cityTableView.reloadData()
}
奇怪的是,當我運行應用程式并設定斷點時,我看到它立即呼叫 minutelyReloadTimer(),連續 59 次(我數過)。

這是最近的 Xcode/Swift 更新的問題,還是我錯過了一些我沒有看到的東西?
uj5u.com熱心網友回復:
我確定您目睹的意外行為不是由于 Xcode/Swift 的問題。
看看你的代碼,我馬上就注意到了一些奇怪的事情。一方面,RunLoop.main.add(timers[j]...只會將計時器的 0-59 添加到運行回圈中,一遍又一遍(準確地說是 24 次)。而對于兩個,calender.date(bySettingHour: i, minute: j, second: 0, of: now)的默認配置是查找與給定資料組件匹配的下一個時間,因為函式的最后一個引數(即matchingPolicy: Calendar.MatchingPolicy)被分配了默認值.nextTime。因此,回傳的日期是明天的,而不是今天的。
現在,與其進一步剖析您的(不必要的復雜)方法,我建議采用更簡單的方法:觸發一個重復的 60 秒計時器,初始觸發在下一分鐘開始。
簡而言之,重構您的代碼將導致以下結果。
func setMinutesForReload(){
//get calender object
let calender = Calendar.current
//curent date
let now = Date()
let dateOfNextMinute: Date = calender.nextDate(after: now, matching: DateComponents(second: 0), matchingPolicy: .nextTime)!
let timer = Timer(fireAt: dateOfNextMinute, interval: 60.0, target: self, selector: #selector(minutelyReloadTimer), userInfo: nil, repeats: true)
RunLoop.main.add(timer, forMode: RunLoop.Mode.common)
}
@objc func minutelyReloadTimer(){
print("Reload")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456817.html
