gpt4 book ai didi

ios - 如何为多个不同的 Controller 制作 NSTimer? swift

转载 作者:行者123 更新时间:2023-11-29 01:22:46 29 4
gpt4 key购买 nike

我在 page-based.based 上制作应用程序。我有多个不同的 Controller 。每个 Controller 都有 NSTimer,它在 Controller viewDidAppear() 时打开。当 Controller 为 viewDidDisappear() 时,我关闭了 NSTimer。当我在 Controller 之间缓慢滑动时它会起作用,但如果我快速滑动 Controller ,一些计时器不会关闭。我尝试了几种不同的方法。第一种方法我将通知发布到关闭计时器的功能,但当我在 Controller 之间缓慢滑动时它也有效。第二种方法是我创建了公共(public)类计时器,我将其用于每个 Controller ,但它对我不起作用。我不知道我怎样才能做到。请帮我。我在 UIView 中也有 NSTimer,它位于 UIViewController 上,当 UIViewController 消失时我需要它来关闭两个计时器。我怎样才能做到?

我在 ViewController 上的例子

  var timer: NSTimer!
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
notificationCenter.postNotificationName("turnOnMemoryArc", object: nil)
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "showMemory", userInfo: nil, repeats: true)
}

override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(true)
if timer != nil {
timer.invalidate()
}
notificationCenter.postNotificationName("turnOffMemoryArc", object: nil)
}

View 中的这段代码

  override func drawRect(rect: CGRect) {
notificationCenter.addObserver(self, selector: "turnOnMemoryTimer", name: "turnOnMemoryArc", object: nil)
notificationCenter.addObserver(self, selector: "turnOffMemoryTimer", name: "turnOffMemoryArc", object: nil)
// timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawMemoryArc", userInfo: nil, repeats: true)
}

func turnOnMemoryTimer() {
print("memory timer is on")
timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawMemoryArc", userInfo: nil, repeats: true)
}

func turnOffMemoryTimer() {
if timer != nil {
timer.invalidate()
}
print("Memory timer turned")
}

第二种方法

import Foundation

public class GlobalTimer {

public init() { }
public var controllerTimer: NSTimer!
public var viewTimer: NSTimer!

}

View Controller

 override func viewDidAppear(animated: Bool) {
super.viewDidAppear(true)
notificationCenter.postNotificationName("turnOnBatteryArc", object: nil)
if GlobalTimer().controllerTimer != nil {
GlobalTimer().controllerTimer.invalidate()
GlobalTimer().controllerTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "batteryStateForLabel", userInfo: nil, repeats: true)
} else {
GlobalTimer().controllerTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "batteryStateForLabel", userInfo: nil, repeats: true)
}
}

界面 View

 func turnOnBatteryTimer() {
print("turnOnBatteryTimer arc")
if GlobalTimer().viewTimer != nil {
GlobalTimer().viewTimer.invalidate()
GlobalTimer().viewTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawBatteryArc", userInfo: nil, repeats: true)
} else {
GlobalTimer().viewTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawBatteryArc", userInfo: nil, repeats: true)
}
}

最佳答案

代码中的主要问题是 GlobalTimer()。这会在您每次编写 GlobalTimer() 时创建新的 GlobalTimer 实例。

以下代码段中的四个不同实例 - 没有共享状态。

if GlobalTimer().viewTimer != nil {
GlobalTimer().viewTimer.invalidate()
GlobalTimer().viewTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawBatteryArc", userInfo: nil, repeats: true)
} else {
GlobalTimer().viewTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawBatteryArc", userInfo: nil, repeats: true)
}

你可以用单例模式修复它......

public class GlobalTimer {
public static let sharedInstance = GlobalTimer()
private init() { }
public var controllerTimer: NSTimer!
public var viewTimer: NSTimer!
}

...通过替换所有 GlobalTimer() 出现...

if GlobalTimer().viewTimer != nil {

... 与 GlobalTimer.sharedInstace ...

if GlobalTimer.sharedInstance.viewTimer != nil {

下一步是 ! 删除,这很危险,如果您不知道自己在做什么,可能会导致崩溃。

public class GlobalTimer {
public static let sharedInstance = GlobalTimer()
private init() { } <-- avoid instantiation outside the file
public var controllerTimer: NSTimer? <-- was !
public var viewTimer: NSTimer? <-- was !
}

剩下的步骤是使用 GlobalTimer 替换您的代码 ...

if GlobalTimer().viewTimer != nil {
GlobalTimer().viewTimer.invalidate()
GlobalTimer().viewTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawBatteryArc", userInfo: nil, repeats: true)
} else {
GlobalTimer().viewTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "drawBatteryArc", userInfo: nil, repeats: true)
}

...与...

GlobalTimer.sharedInstance.viewTimer?.invalidate()
GlobalTimer.sharedInstance.viewTimer = NSTimer.scheduled...

第一行说 - 如果 viewTimer != nil 则调用 viewTimer 上的 invalidate() 函数,否则什么也不会发生(类似于 nil ObjC 中的消息传递,...)。这允许您删除 if 条件,因为它会使计时器无效或什么都不做。

第二行只是分配新的定时器。

关于ios - 如何为多个不同的 Controller 制作 NSTimer? swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34397691/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com