- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所有单例函数都是两次调用。“Prova”函数和定时器的选择器是两次调用。
class Timer {
static let sharedInstanceTimer = Timer()
var TimerCounter : NSTimer = NSTimer()
var Counter : Int = Int()
var TimerGameOver : Int = Int()
var TimerBonusMultipleCircle : Int = Int()
var TimerBonusBigCircle : Int = Int()
var TimerCounterInterval : NSTimeInterval = 1
init()
{
self.Counter = 60
self.TimerGameOver = 10
self.TimerBonusMultipleCircle = 5
self.TimerBonusBigCircle = 5
self.TimerCounterInterval = 1
}
func StartTimerCounter()
{
self.TimerCounter = NSTimer.scheduledTimerWithTimeInterval(self.TimerCounterInterval, target: Game.sharedInstanceGame, selector: #selector(Game.sharedInstanceGame.UpdateAllCounter), userInfo: nil, repeats: true)
}
func StopTimerCounter()
{
self.TimerCounter.invalidate()
}
}
然后...在另一个文件中,我调用了 StartTimerCounter()
import UIKit
class FirstViewController: UIViewController {
static let sharedInstanceFirstViewController = FirstViewController()
override func viewDidLoad() {
super.viewDidLoad()
let backButton = UIBarButtonItem(title: "00:00:60", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
backButton.tintColor = UIColor.whiteColor()
navigationItem.leftBarButtonItem = backButton
Circle.sharedInstanceCircle.CreateCircle()
view.layer.addSublayer(Circle.sharedInstanceCircle.PrincipalCircle)
Game.sharedInstanceGame.Play()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func prefersStatusBarHidden() -> Bool {
return true
}
func ReturnToMenu()
{
navigationController?.popViewControllerAnimated(true)
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
抛开我按照下面的建议更正的各种错误,我尝试了几种解决方案,但我找不到解决这个问题的方法。
最佳答案
几个想法:
您的 sharedInstanceTimer
正在实例化 Timer
(它本身就是一个 NSTimer
)。它不应该是 NSTimer
的子类。
然后您将 TimerCounter
初始化为您从未使用过的第二个计时器。
上面会实例化两个定时器。然后,您将拥有 StartTimerCounter
,它会在您每次调用它时实例化另一个 NSTimer
。假设您只需要一个计时器,您应该让 StartTimerCounter
在启动新计时器之前使任何先前的计时器无效。
我将此类称为 TimerManager
或类似名称,以避免与 Swift 3 类型 Timer
发生冲突。
方法名称应以小写字母开头,属性也应如此。本着 Swift 3 API 指南的精神,您可能也想缩短方法名称。
此外,如果您要定义一个单例,我会声明一个 private init()
初始化程序,以防止其他类意外地实例化另一个 TimerManager
对象。
所以,这会产生如下内容:
class TimerManager {
static let shared = TimerManager()
private var timer: NSTimer? // this certainly should be private
// whether you make these private or not, or constants vs properties, is up to you
private var tounter : Int = 60
private var timerGameOver : Int = 10
private var timerBonusMultipleCircle : Int = 5
private var timerBonusBigCircle : Int = 5
private var timerCounterInterval : NSTimeInterval = 1
// make sure no one else accidentally instantiates another TimerManager
private init() {
}
/// Start timer.
func startTimer() {
stopTimer() // cancel prior timer, if any
timer = NSTimer.scheduledTimerWithTimeInterval(timerCounterInterval, target: Game.sharedInstanceGame, selector: #selector(Game.sharedInstanceGame.updateAllCounter), userInfo: nil, repeats: true)
Game.sharedInstanceGame.prova()
}
/// Stop timer.
func stopTimer() {
timer?.invalidate()
timer = nil
}
}
这里有一个不相关的更深入的观察:我建议您将计时器对象与 Game
对象保持松散耦合。所以,我会从这个类中删除所有与“游戏”相关的内容:
class TimerManager {
static let shared = TimerManager()
private var timer: NSTimer? // this certainly should be private
private var timerHandler: (() -> ())?
// whether you make these private or not, or constants vs properties, is up to you
private var timerCounterInterval: NSTimeInterval = 1
// make sure no one else accidentally instantiates another TimerManager
private init() {
}
/// Start timer.
///
/// - parameter timerHandler: The closure that will be called once per second.
func startTimer(timerHandler: () -> ()) {
stopTimer() // cancel prior timer, if any
self.timerHandler = timerHandler
timer = NSTimer.scheduledTimerWithTimeInterval(timerCounterInterval, target: self, selector: #selector(handleTimer(_:)), userInfo: nil, repeats: true)
}
@objc func handleTimer(timer: NSTimer) {
timerHandler?()
}
/// Stop timer.
func stopTimer() {
timer?.invalidate()
timerHandler = nil
timer = nil
}
}
然后,当 Game
对象想要启动计时器时,它可能会这样做:
TimerManager.shared.startTimer {
self.updateAllCounter()
}
prova()
现在,也许您出于这个问题的目的简化了您的计时器对象,并且这个 TimerManager
对象可能还需要更多的东西(正如所有这些其他属性所建议的那样,这些属性在您的代码片段),但希望这能说明基本思想:TimerManager
不应参与调用任何特定 Game
方法等的业务。它应该简单地提供一种机制,调用者可以通过该机制简单地提供计时器应定期调用的代码块。
关于ios - 单例 SharedInstance 函数被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39320817/
在此代码中,当我键入 GIDSignIn.sharedInstance 时,出于某种原因 sharedInstance 不是函数,这意味着我无法访问 clientID。我在任何地方都找不到解决方案。
在我的代码中,我初始化了两个单例。我有 var session = AVAudioSession.sharedInstance 和 var audioSession = AVAudioSession.
我正在将项目转换为 SDK。我需要将几个实例方法转换为类方法。我收到有关使用“self”的编译器警告。警告是“使用 Class 表达式初始化 Store* 的不兼容指针类型。此 Store 类是单例
假设我有以下单例: @interface ABCSingleton: NSObject @property (nonatomic, copy) NSString *name; @property (n
所有单例函数都是两次调用。“Prova”函数和定时器的选择器是两次调用。 class Timer { static let sharedInstanceTimer = Timer()
我正在创建一个音频应用程序,我希望音频在屏幕关闭时继续播放。(它在屏幕打开时在后台运行良好。) 在 xcode 上启用了后台模式(我在 Info.plist 中设置了“音频”值。)并且我实现了“AVA
我不久前在我的 iOS 项目中集成了 Digits by Fabric 以通过电话号码对用户进行身份验证,直到最近我的应用程序开始崩溃时一切正常,原因是我们在项目中初始化 Digits 的以下代码行:
我有一个小型 iOS 应用程序 (xcode8 ios10),我需要用户使用 facebook 或 google 登录。我已经完成了 facebook 部分,并且效果很好。然后今天我添加了谷歌登录支持
具有以下单例: class Colors { static let sharedInstance = Colors() private init() {} let mainCo
sharedInstance 究竟是什么?我是说有什么用? 目前我在 2 个不同文件之间进行通信时遇到了一些问题。 这是我的问题: 我有 1 个文件调用 A.h/A.m 和另一个文件调用 B.h/B.
我们正在使用键值观察来查看音频输出路由是否通过以下代码进行了更改: AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [a
我正在尝试在我的 iOS 应用程序中使用 TwitterKit 框架(在 Swift 中)。但是,当我使用 Twitter.sharedInstance().APIClient 时,会出现错误,提示“
我已经阅读了谷歌文档来寻求答案,我也查看了一些类似的帖子,但这些都没有帮助我解决我的问题。我正在尝试将 UIButton 设置为 google 登录的触发器。由于某种原因,它压碎了。我当然会添加我编写
我想从一些代码中展示一个 MFMailComposerViewController,这些代码深藏在可通过共享实例访问的实用程序类中。 当我尝试时 [self presentViewController
使用以下代码,我得到了输出音量,但它确实不一致 - 有时它给出相同的值,有时它是一个落后的音量变化,尽管系统音量实际上是正确变化的。 有什么办法让它每次都输出正确的值? func viewDidLoa
我有一个要使用 XCTest 测试的类,这个类看起来像这样: public class MyClass: NSObject { func method() { // Do s
我正在将一些自 iOS 9.0 以来已弃用的 UIAlertViews 更新为 UIAlertViewControllers。 使用 UIAlertView,可以从任何正在执行的代码中抛出警报——即使
我正在创建一个快速框架。其中一个类如下所示。 import Foundation @objc public class classA: NSObject { public overr
我遇到了类似于 this one 的问题。基本上每次我的应用启动时,我都必须使用我的 Google 帐户登录。 然后,我有这个属性: var isGoogleSessionOpen: Bool {
我在 sharedInstance return Static.instance! 行发生以下崩溃: EXC_BREAKPOINT 0x0000000100da42d8 崩溃发生在没有调试断点的 Ad
我是一名优秀的程序员,十分优秀!