2017-10-04 61 views
1

對不起我堅持,但我試圖啓動後臺任務(XCode8,迅疾3)無法啓動beginBackgroundTask SWIFT 3

從這裏舉例:https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW3

在AppDelegate.swift:

func applicationDidEnterBackground(_ application: UIApplication) { 
    var bgTask: UIBackgroundTaskIdentifier = 0; 
    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in 
     print("The task has started") 
     application.endBackgroundTask(bgTask) 
     bgTask = UIBackgroundTaskInvalid 
    }) 
} 

該應用程序從未顯示「任務已啓動」消息。我究竟做錯了什麼?

+0

我認爲expirationHandler只是在後臺任務完成後立即執行。 – Christoph

+0

@Christoph無論如何,信息應該出現 – Alex

回答

0

到期處理程序塊在一段時間後(通常5分鐘左右)被調用。 這是爲了用來寫清理邏輯,如果你的後臺任務需要花費很多時間來完成。

您的代碼沒有任何問題,您只需要在後臺中等待以使後臺任務過期。

+0

代碼有問題。代碼被寫入,就像立即調用到期處理程序一樣。打印語句不應該在過期處理程序中。也不應該調用'application.endBackgroundTask(bgTask)'。兩者都應該在調用'beginBackgroundTask'之後。 – rmaddy

+0

@rmaddy:打印中的語句錯誤,但可以在此處理程序中的應用程序上調用endBackgroundTask以防止系統殺死該應用程序。 –

+1

@Puneet夏爾馬你是對的。 3-4分鐘後出現消息 – Alex

2

您對後臺任務的使用是錯誤的。它應該是這樣的:

func applicationDidEnterBackground(_ application: UIApplication) { 
    var finished = false 
    var bgTask: UIBackgroundTaskIdentifier = 0; 
    bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in 
     // Time is up. 
     if bgTask != UIBackgroundTaskInvalid { 
      // Do something to stop our background task or the app will be killed 
      finished = true 
     } 
    }) 

    // Perform your background task here 
    print("The task has started") 
    while !finished { 
     print("Not finished") 
     // when done, set finished to true 
     // If that doesn't happen in time, the expiration handler will do it for us 
    } 

    // Indicate that it is complete 
    application.endBackgroundTask(bgTask) 
    bgTask = UIBackgroundTaskInvalid 
} 

另外請注意,你應該要保持運行,即使應用程序進入後臺一個短的時間內任何一類使用beginBackgroundTask/endBackgroundTask周圍的任何代碼。

+0

@maddy - 你說得對,但我不明白應該在expirationHandler中執行哪段代碼。 – Alex

+0

@rmaddy是不是你的代碼不正確?我的意思是,如果有這樣的印刷線需要20分鐘。 (在這裏它不會發生),然後從expirationHandler,你不會調用'application.endBackgroundTask(bgTask)',那會導致崩潰... – Honey

+0

@Honey這是過期處理程序的用途。看到我的評論「做點什麼來阻止......」? 「做某事」是做一些事情,阻止任何過度長時間運行的後臺任務。很顯然'print'不會太長。但是,假設你有一個「while」循環時間過長。過期處理程序需要設置一個在'while'循環中檢查的變量,以便'while'循環在下一次迭代時停止。至少這是一個例子。 – rmaddy