Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 解除分配视图控制器后运行任务_Ios_Objective C - Fatal编程技术网

Ios 解除分配视图控制器后运行任务

Ios 解除分配视图控制器后运行任务,ios,objective-c,Ios,Objective C,假设我有两个ViewController的A和BViewController A几乎没有项目,选择其中一个项目后,我按下ViewControllerB显示所选项目的详细信息。在详细信息页面上,我可以为该项目设置计时器。现在我想实现的是,当用户为某个特定项目启动计时器时,他应该能够返回到ViewController a,选择另一个项目并启动该项目的计时器,如果他选择了计时器已经在运行的同一项目,它应该显示剩余时间。我有一个方法,当计时器结束时,该方法将针对特定项执行。我已经让它工作了,但有一个问题

假设我有两个
ViewController
A
B
ViewController A
几乎没有项目,选择其中一个项目后,我按下
ViewController
B
显示所选项目的详细信息。在详细信息页面上,我可以为该项目设置计时器。现在我想实现的是,当用户为某个特定项目启动计时器时,他应该能够返回到
ViewController a
,选择另一个项目并启动该项目的计时器,如果他选择了计时器已经在运行的同一项目,它应该显示剩余时间。我有一个方法,当计时器结束时,该方法将针对特定项执行。我已经让它工作了,但有一个问题,当用户启动详细信息页面上的计时器,即
ViewController B
并返回时,计时器停止,因为
ViewController
被解除分配。我想知道什么方法适合这种情况?非常感谢您的帮助。

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


让我们将其称为ex.订单存储,并将其作为一个单件。这是一个简单的解决方案,可以根据您的要求进行增强

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

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")})

您应该编写一个单独的类来管理数据,而不是在视图控制器中这样做。在整个应用程序的生命周期中都有此类的实例或单个实例。您可以在AppDelegate中创建计时器。您可以创建后台服务,一旦视图消失,就可以调用方法来启动BS。问题被标记为
objective-c