2015-04-04 45 views
1

UIViewController中,我有一個NSTimer計劃每隔1秒觸發一次,使用scheduledTimer方法,所以我可以每秒在視圖中更新一個UILabel。但問題是,NSTimer開火似乎被延遲,只要我在UIView內的MKMapView周圍搖晃。所以延遲導致UILabel不是統一更新,這是不好看的。由MKMapView平移導致的延遲是否會佔用太多資源?我如何安排NSTimer,以便不會有任何延遲,但我平移MKMapView? (但是,請注意,我沒有在某種後臺線程上安排NSTimer,它在主線程中。)謝謝。NSTimer似乎被MKMapView平移減慢了?

+0

是否在後臺線程中設置了定時器來做計算,然後用'dispatch_async'獲取主線程來更新UI,工作? dispatch_async示例顯示在此asnwer:http://stackoverflow.com/questions/16283652/understanding-dispatch-async – Zhang 2015-04-04 13:19:52

+0

你是如何安排計時器?如果您希望它在滾動/平移時觸發,則需要使用「NSRunLoopCommonModes」來安排它。 – dan 2015-04-04 14:00:03

回答

3

如果您使用scheduledTimerWithTimeInterval(...)來創建您的計時器,它將被添加到模式爲NSDefaultRunLoopMode的當前runloop。計時器不會在您的應用程序忙於事件跟蹤時觸發,即如果您在UIScrollView中滾動,或者如果您與UI進行任何其他交互。

如果您使用NSRunLoopCommonModes作爲模式,則計時器將在您與用戶界面進行交互時觸發,您可以創建一個未計劃的NSTimer並將其自動添加到runloop中。

let timer = NSTimer(timeInterval: 1.0, target: self, selector: Selector("timerFired:"), userInfo: nil, repeats: true) 
NSRunLoop.currentRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 

如需進一步信息,問題NSDefaultRunLoopMode vs NSRunLoopCommonModes包含了不同runloop模式一個很好的解釋。

+0

謝謝,但有一個問題...應用程序註冊後臺位置更新,我用來獲取位置更新的CLLocationManager是延遲更新啓用。我試圖用NSRunLoopCommonModes將計時器添加到運行循環中,但似乎系統在運行時間過長時會終止該應用。我認爲這是因爲當運行循環應該被禁用時,NSTimer正在佔用NSRunLoop。 – Blip 2015-04-04 21:44:51

+0

如果應用程序進入後臺,則會使計時器無效,並在應用程序再次進入前臺時重新創建它 – 2015-04-05 10:45:13

+0

謝謝您的天才建議解決了我的問題。 – Blip 2015-04-07 21:44:37