运行后台计时器Swift

时间:2019-03-19 08:48:05

标签: swift timer

我解决了这个问题。

var backgroundUpdateTask: UIBackgroundTaskIdentifier = 0

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    return true
}

func applicationWillResignActive(application: UIApplication) {
    self.backgroundUpdateTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({
        self.endBackgroundUpdateTask()
    })
}

func endBackgroundUpdateTask() {
    UIApplication.sharedApplication().endBackgroundTask(self.backgroundUpdateTask)
    self.backgroundUpdateTask = UIBackgroundTaskInvalid
}

func applicationWillEnterForeground(application: UIApplication) {
    self.endBackgroundUpdateTask()
}

计时器在激活之前无法工作。即使在后台运行应用程序,我也想执行计时器更新过程。我使用滴答功能更新当前时间,并且当计时器与开机/关机计时器同步时,我会进行开机或关机操作。我希望计时器和更新过程在后台运行。

override func viewDidLoad()
    {
        super.viewDidLoad()
 timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector:#selector(self.tick) , userInfo: nil, repeats: true)
}

@objc func tick() {
        let formatter = DateFormatter()
        formatter.dateFormat = "dd/MM/yyyy HH:mm"

        labelTimer.text = formatter.string(from: Date())

        zaman()
        zaman1()
    }

@objc func zaman(){

        if timertext.text == String? (labelTimer.text!) {
            zamanlayıcıfunc()
        }else{
return
        }
    }
    @objc func zamanlayıcıfunc()
    {

            if labelcheckbox.text == ("aç"){
                updateState()

            }
           if labelcheckbox.text == ("kapat"){
                updateState1()
            }

        }


    @objc func zaman1(){

        if timertext2.text == String? (labelTimer.text!) {
            zamanlayıcıfunc1()
        }else{
            return
        }
    }
    @objc func zamanlayıcıfunc1()
    {

        if labelcheckbox2.text == ("saatinde kapat"){
            updateState1()

        }
        else{
            updateState()
        }

    }

 @objc func updateState(){


            let ref = Database.database().reference()
            ref.child("\(chip1InfoString1!)/states/\(self.ekle2.text!)").setValue(true)
getData()
    }

1 个答案:

答案 0 :(得分:4)

您的应用程序将不会在后台继续处理。如果所有应用程序都可以做到,那么手机电池将很快被耗尽。

操作系统将为您提供一些有限的后台执行时间,但是如果您使用过多的资源,则会进一步受到限制。您可以详细了解in Apple's documentation

您可能需要做的是使用UIApplication.didEnterBackgroundNotificationUIApplication.willEnterForegroundNotification跟踪应用何时进入后台和前台,以查看经过了多少时间。