2017-04-11 61 views
1

我是新手在iOS/Swift中。我嘗試了很多Q &至於在stackoverflow.com上,但還沒有找到解決方案。Swift 3.0:定時器不能在第一時間工作

有沒有人解釋我爲什麼我的計時器不能在第一時間(*)工作,但第二次正常工作。 (*)第一次:運行應用程序到我的iPhone(5S),在應用程序完成啓動後,單擊主頁以轉到後臺,間隔時間後,startSendDataSchedule被調用但未完成且後臺結束。此處停止的應用程序 過了幾秒鐘,我前臺應用程序,startSendDataSchedule再次運行併發送數據到多個日誌的服務器被打印出來。

第二次:從(*)再次點擊Home進入背景,startSendDataSchedule繼續運行。我斷開服務器以退出startSendDataSchedule。 Ater intervalTime,startSendDataSchedule被調用並按照我的期望執行。從現在起,定時器工作正常

我的錯誤是什麼?如果有人回答我,我將不勝感激。

我的代碼(SWIFT 3,xcode的8.2的iOS 10.2):

static func startFetching(inttervalTime : TimeInterval){ 

    registerBackgroundTask() // register background with UIApplication.shared.beginBackgroundTask 

    //inttervalTime = 5 min 
    let date = NSDate().addingTimeInterval(inttervalTime) 

    print("Background trace1: thread=\(Thread.current)") 
    if (Thread.isMainThread == true) { 
     print("Background trace: main thread") // Go to Here 
    } else { 
     print("Background trace: thread=\(Thread.current)") 
    } 

    guard timerT == nil else { return } 

    // Set scheduler 
    //DispatchQueue.main.async { 
     self.timerT = Timer(fireAt: date as Date, interval: inttervalTime, target: self, selector: #selector(startSendDataSchedule), userInfo: nil, repeats: true) 
     //self.timerT = Timer.scheduledTimer(timeInterval: inttervalTime, target: self, selector: #selector(startSendDataSchedule), userInfo: nil, repeats: true) 

     // 
     RunLoop.main.add(timerT!, forMode: RunLoopMode.commonModes) // need if you use Timer init, no if use scheduledTimer 
    //} 

    // Subscribe to UIApplicationDidBecomeActive 
    NotificationCenter.default.addObserver(self, selector: #selector(reinstateBackgroundTask), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil) 
} 

回答

0

我解決由火定時器立即被改變[日期日期]至[日期()]

self.timerT =定時器(fireAt:日期(),間隔:inttervalTime,目標:自我,選擇:#selector(startSendDataSchedule),用戶信息:無,重複:真)

如果我的iPhone連接到的XCode它做工精細。但是當直接運行iPhone時,Timer沒有被觸發,我發現我的應用程序崩潰了。

  1. 你能解釋一下爲什麼th應用程序崩潰了嗎?

我的應用程序名稱:HealthSprite

崩潰日誌: ncident標識符:AFE9BD21-F6B3-473F-96E7-60778FF26647 CrashReporter始終重點:dec5755cdf37668f857c5e737e56f147e768c673 硬件型號:iPhone6,1 過程:HealthSprite [598] 路徑:/private/var/containers/Bundle/Application/3C5942E3-4308-489A-94BB-DA5DEFB48B39/HealthSprite.app/HealthSprite 標識符:jp.sprite.vn.HealthSprite 版本:7526(0.9.0) 代碼類型:ARM-64(Native) 角色:前景 父進程:的launchd [1] 聯盟:jp.sprite.vn.HealthSprite [731]

日期/時間:2017年4月12日15:21:13.3154 0700 啓動時間:2017年-04-12 15:18:01.0932 +0700 操作系統版本:iPhone OS 10.2。1(14D27) 報告版本:104

異常類型:EXC_CRASH(SIGKILL) 異常代碼:0x0000000000000000,0x0000000000000000 異常注:EXC_CORPSE_NOTIFY 終止原因:命名空間跳板代碼0x8badf00d 由線索觸發:0

過濾系統日誌: 無發現

主題0名:調度隊列:com.apple.main線程 螺紋0墜毀: 0 libsystem_kernel.dylib 0x00000001862 99188 mach_msg_trap + 8

1 libsystem_kernel.dylib 0x0000000186298ff8 mach_msg + 72

2的CoreFoundation 0x00000001872965d0 __CFRunLoopServiceMachPort + 192

3的CoreFoundation 0x00000001872941ec __CFRunLoopRun + 1132

4的CoreFoundation 0x00000001871c22b8 CFRunLoopRunSpecific + 444

5 GraphicsServices 0x0000000188c76198 GSEventRunModal + 180

6的UIKit 0x000000018d2097fc - [UIApplication的_run] + 684

7的UIKit 0x000000018d204534 UIApplicationMain + 208

8 HealthSprite 0x00000001000f8ffc 0x100078000 + 528380

9 libdyld.dylib 0x00000001861a55b8啓動+ 4

...