后台运行计时器快速

时间:2018-10-27 07:39:24

标签: swift timer

即使关闭应用程序,我也希望计时器运行。我希望它在后台柜台工作。运行计时器时,计时器会倒退一秒。(计数器)我该怎么做?

// Program takes user entered letter and matches it with the corresponding ICAO word.
//Program has been modified to use void and string methods

#include "stdafx.h"
#include "iostream"
#include "string"

using namespace std;

//Function Heading
void convert(string);

//Main Function
int main()
{
    string input;
    cout << " Enter a letter or word: ";   // Ask the user to enter a letter or word.
    cin >> input;                          //get input
    cout << "Phonetic Version : ";         //Display "Phonetic Version"

    convert (input);                        
    cout << endl;
    system("pause");
}//End Main

//Function Definition
void convert(string input)
{
    int i = 0;      //input variable
    char letters;   //character variable 
    int length = input.length(); 

    while (i < length)      //While loop initialized
    {
        letters = input.at(i);
        if (letters == 'a' || letters == 'A')
            cout << "Alpha ";
        else if (letters == 'b' || letters == 'B')
            cout << "Bravo ";
        else if (letters == 'c' || letters == 'C')
            cout << "Charlie ";
        else if (letters == 'd' || letters == 'D')
            cout << "Delta ";
        else if (letters == 'e' || letters == 'E')
            cout << "Echo ";
        else if (letters == 'f' || letters == 'F')
            cout << "Foxtrot ";
        else if (letters == 'g' || letters == 'G')
            cout << "Golf ";
        else if (letters == 'h' || letters == 'H')
            cout << "Hotel ";
        else if (letters == 'i' || letters == 'I')
            cout << "India ";
        else if (letters == 'j' || letters == 'J')
            cout << "Juliet ";
        else if (letters == 'k' || letters == 'K')
            cout << "Kilo ";
        else if (letters == 'l' || letters == 'L')
            cout << "Lima ";
        else if (letters == 'm' || letters == 'M')
            cout << "Mike ";
        else if (letters == 'n' || letters == 'N')
            cout << "November ";
        else if (letters == 'o' || letters == 'O')
            cout << "Oscar ";
        else if (letters == 'p' || letters == 'P')
            cout << "Papa ";
        else if (letters == 'q' || letters == 'Q')
            cout << "Quebec ";
        else if (letters == 'r' || letters == 'R')
            cout << "Romeo ";
        else if (letters == 's' || letters == 'S')
            cout << "Sierra ";
        else if (letters == 't' || letters == 'T')
            cout << "Tango ";
        else if (letters == 'u' || letters == 'U')
            cout << "Uniform ";
        else if (letters == 'v' || letters == 'V')
            cout << "Victor ";
        else if (letters == 'w' || letters == 'W')
            cout << "Whiskey ";
        else if (letters == 'x' || letters == 'X')
            cout << "X-ray ";
        else if (letters == 'y' || letters == 'Y')
            cout << "Yankee ";
        else if (letters == 'z' || letters == 'Z')
            cout << "Zulu ";
        i++;
    }
}

2 个答案:

答案 0 :(得分:0)

您的 iOS应用即使在后台中执行某些操作的唯一方法是使用Background Modes

Background modes as shown in Xcode

  

但是,您在执行任何操作时都无法执行任何操作   应用程序处于后台

您可以执行的任务类型有某些限制。我附上了一篇非常好的文章供您参考

Background Modes Tutorial

但是,我不确定 在您的应用程序处于后台状态时是否可以启动并继续计时器各种功能

尽管如此,请紧记,一旦您的应用程序关闭(即,双击主屏幕按钮并向上滑动应用程序窗口以完全关闭它),那时候甚至后台模式都无法工作,因为用户不想再运行您的应用,即使在后台

答案 1 :(得分:0)

我不清楚您想要实现什么。假设您要在计时器每1秒启动一次后更新标签。那么一种方法是:-

  1. 如果持续时间剩余,则在视图加载时启动计时器。
  2. 注册申请WillTerminate
  3. 在应用程序中,终止将保存传递的持续时间和终止时间,以计算下一次启动的剩余时间。

    var remainingDuration: TimeInterval!
    
    override func viewDidLoad() {
     super.viewDidLoad()
    
     let remainingDurationFromLastLaunch = UserDefaults.standard.object(forKey: "duration") as? TimeInterval ?? 0
     let lastTerminatedTime = UserDefaults.standard.object(forKey: "lastTerminatedDate") as? Date ?? Date()
    
    if Date().timeInterval(since: lastTerminatedTime) > remainingDurationFromLastLaunch {
    
      remainingDuration = remainingDurationFromLastLaunch - Date().timeInterval(since: lastTerminatedTime)
      timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(TimerViewController.counter), userInfo: nil, repeats: true)
      NotificationCenter.default.addObserver(self, selector: #selector(TimerViewController.applicationWillTerminate), name: NSNotification.Name.UIApplicationWillTerminate, object: nil)
    
    } else { //Duration is passed....Do whatever you want
    
     }
    }
    
    @objc func counter() {
    
    remainingDuration -= 1
    if remainingDuration == 0 { //Duration is passed....Do whatever you want
       timer.invalidate()
       timer = nil
     } else {
       favoriteDayTextField.text = String(remainingDuration) + " Seconds"
    }
    }
    
    @objc func applicationWillTerminate() {
       if timer != nil {
       backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
        UserDefaults.standard.set(remainingDuration, forKey: "duration")
         UserDefaults.standard.set(Date(), forKey: "lastTerminatedDate")
    
        }
        self?.endBackgroundTask()
       }
      }
    
    func endBackgroundTask() {
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = UIBackgroundTaskInvalid
    }
    
相关问题