如何为多个不同的控制器制作 NSTimer?在 swift
How to make NSTimer for multiple different controllers? In swift
我在页面-based.based上制作应用程序。我有多个不同的控制器。每个控制器都有NSTimer
,当控制器viewDidAppear()
时打开。当控制器为 viewDidDisappear()
时,我关闭了 NSTimer。当我在控制器之间缓慢滑动时它会起作用,但如果我快速滑动控制器,一些计时器不会关闭。我尝试了几种不同的方法。第一种方法我 post 通知关闭计时器的功能,但当我在控制器之间缓慢滑动时它也有效。我创建的第二种方法 public class 计时器,我将其用于每个控制器,但它对我不起作用。我不知道我怎样才能做到。请帮我。我在 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)
}
此代码在视图中
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!
}
ViewController
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)
}
}
UIView
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)
}
}
尝试将 timer.invalidate() 放入视图中将会消失,而不是确实消失。执行此操作时根本不需要通知。
您代码中的主要问题是 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()
函数,否则什么也不会发生(类似于 ObjC 中的 nil
消息,...)。这允许您删除 if
条件,因为它会使计时器无效或什么都不做。
第二行只是分配了新的定时器。
我在页面-based.based上制作应用程序。我有多个不同的控制器。每个控制器都有NSTimer
,当控制器viewDidAppear()
时打开。当控制器为 viewDidDisappear()
时,我关闭了 NSTimer。当我在控制器之间缓慢滑动时它会起作用,但如果我快速滑动控制器,一些计时器不会关闭。我尝试了几种不同的方法。第一种方法我 post 通知关闭计时器的功能,但当我在控制器之间缓慢滑动时它也有效。我创建的第二种方法 public class 计时器,我将其用于每个控制器,但它对我不起作用。我不知道我怎样才能做到。请帮我。我在 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)
}
此代码在视图中
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!
}
ViewController
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)
}
}
UIView
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)
}
}
尝试将 timer.invalidate() 放入视图中将会消失,而不是确实消失。执行此操作时根本不需要通知。
您代码中的主要问题是 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()
函数,否则什么也不会发生(类似于 ObjC 中的 nil
消息,...)。这允许您删除 if
条件,因为它会使计时器无效或什么都不做。
第二行只是分配了新的定时器。