取消分配视图控制器后运行任务

时间:2018-04-13 09:57:42

标签: ios objective-c

考虑我有两个ViewController' ABViewController A项目很少,在选择其中一项后,我会ViewController B显示所选项目的详细信息。在详细页面上,我可以为该项目设置计时器。现在我想要实现的是当用户为特定项目启动计时器时,他应该能够返回ViewController A,选择另一个项目并启动该项目的计时器,以防万一选择计时器已经运行的相同项目应该显示剩余时间。我有一个方法,在计时器结束时为该特定项执行。我有这个工作,但有一个问题,当用户在详细信息页面上启动计时器,ViewController B并导航回来时,计时器停止,因为ViewController已被释放。我想知道什么方法适合这种情况?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

你可以创建一个单独的对象来存储类似 NSDictionary< NSString,NSDate> 。它将包含所选项目的ID作为密钥和到期日期。当您导航到 ViewController B 时,您只需要检查此项目是否存在过期日期并继续倒计时或在字典中创建新记录并执行相同操作。

我们先叫它吧。 OrdersStorage 并将其设为单身人士。这是一个简单的解决方案,可以根据您的要求进行增强

答案 1 :(得分:-1)

尝试使用Singleton结构来保存计时器,如下所示:

import UIKit
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

//Singleton Structure
class MyTimers {
    static let shared: MyTimers = MyTimers()
    var timers: [Timer] = []

    func addTimer(with timeInterval: TimeInterval, with repeats: Bool = false,and completion: (() -> Void)? ) {
    let timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: repeats){ thisTimer in
        thisTimer.invalidate()
        if let index = self.timers.index(of: thisTimer) {
            self.timers.remove(at: index)
        }
        completion?()
    }
    timers.append(timer)
  }
}

MyTimers.shared.addTimer(with: 2.0, and: {print("2  with: \(MyTimers.shared.timers.count) timers")})
MyTimers.shared.addTimer(with: 5.0, and: {print("5  with: \(MyTimers.shared.timers.count) timers")})
MyTimers.shared.addTimer(with: 10.0, and: {print("10 with: \(MyTimers.shared.timers.count) timers")})
MyTimers.shared.addTimer(with: 4.0, and: {print("4  with: \(MyTimers.shared.timers.count) timers")})
MyTimers.shared.addTimer(with: 8.0, and: {print("8  with: \(MyTimers.shared.timers.count) timers")})