我的快速应用程序中有两个视图。我正在执行以下segue。
ViewController.swift -----------------> GameViewController.swift
加载GameViewController时,还会将一个值数组从ViewController.swift传递给GameViewController.swift
计时器应在GameViewController.swift中初始化
我试图初始化一个计时器并通过它调用一个方法,但是它不起作用。
以下是我的代码段。
ViewController.swift
func signIn(difficultyLvl:String){
let username = usernameTxt.text
let password = passwordTxt.text
let url = URL(string: "http://192.168.1.106/speed/scoreBoardController.php?username="+username!+"&password="+password!+"&action=SIGNIN")
let task = URLSession.shared.dataTask(with: url!) {(data, response, error) in
let isPassed = String(data: data!, encoding:.utf8)?.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
var gameViewControllerParams = [Int: [String: String]]()
gameViewControllerParams[0] = ["userId" : isPassed!]
gameViewControllerParams[1] = ["difficultyLvl" : difficultyLvl]
if(isPassed != "null"){
self.performSegue(withIdentifier: "gotoGame", sender: gameViewControllerParams)
}
}
task.resume()
}
GameViewController.swift
class GameViewController: UIViewController {
var gameViewControllerParams = [Int: [String: String]]()
override func viewDidLoad() {
super.viewDidLoad()
let _ = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector: #selector(self.setCalculationLs), userInfo:nil,repeats: true)
}
func setCalculationLs(){
print("Timing")
}
}
计时器不适用于后台队列(不费吹灰之力就涉及创建运行循环或在现有运行循环上手动调度它)。但是无论如何,您绝不应该从主队列之外的任何其他位置启动任何UI更新。
因此,由于您是performSegue
从URLSession
完成关闭(在后台队列中运行)调用的,因此它实际上也viewDidLoad
从后台队列中运行。因此,计划计时器的尝试失败。要解决此问题,您必须手动将performSegue
代码分发到主队列:
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
...
if isPassed != "null" {
DispatchQueue.main.async {
self.performSegue(withIdentifier: "gotoGame", sender: ...)
}
}
}
如果您不确定主队列上是否正在运行某些代码,请参阅文档。或者,您可以使用调度先决条件:
dispatchPrecondition(condition: .onQueue(.main))
这样,如果您不小心从后台队列中调用了代码,它将(在调试版本中)停止应用程序。
与您当前的问题无关,但顺便说一句,为避免计时器和视图控制器之间的引用周期过长,通常需要保留对计时器的引用,以便invalidate
在视图消失时可以使用它(例如,在viewDidAppear
和中创建计时器)。将其删除viewDidDisappear
)。否则,您可以GameViewController
在将其关闭后保留它们,例如:
class GameViewController: UIViewController {
weak var timer: Timer?
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
timer = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector: #selector(setCalculationLs(_:)), userInfo: nil, repeats: true)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
timer?.invalidate()
}
@objc func setCalculationLs(_ timer: Timer) {
print("Tick")
}
}
或在iOS 10或更高版本中,您可以在和中使用基于块的变体,并weak
参考:self``invalidate``deinit
class GameViewController: UIViewController {
weak var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] timer in
self?.setCalculationLs()
}
}
deinit {
timer?.invalidate()
}
func setCalculationLs() {
print("Tick")
}
}
因此,我在一个控制器中有一个非常简单的代码片段,在这个代码片段中,我使用从外部文件中获取数据,它工作得很好!但是当我使用时,我会在控制台中得到一个
问题内容: 正则表达式似乎还可以,因为第一行将子字符串正确替换为“ helloworld”,但是后者却不匹配,因为我看不到“ whynothelloworld?”。在控制台上 问题答案: 期望 整个 字符串匹配,而不仅仅是子字符串。 使用正则表达式匹配器对象的方法代替:
问题内容: 我的 活动无法正常进行。 以下是我一一尝试过的代码段,但无济于事: 使用方法实施 设定方法 使用方法 这是我完整的MainActivity.java文件: 问题答案: 我遇到了同样的问题,我发现Android非常注重布局XML。我将NavigationView作为DrawerLayout的第一个孩子,但是出于某些愚蠢的原因,它必须是最后一个孩子。因此,您的布局必须具有以下顺序的元素:
问题内容: 在什么情况下,java的System.out.println无法产生任何输出。我在方法内部调用了它,有时在调用该方法时得到了println,而有时却没有。 更新:我还在println之后使用System.out.flush()。 更新:感谢您的调试帮助。原来,阻止调用打开了一个对话框,使输出看起来与正常顺序大相径庭。我以为我要打印消息的方法是在对话框关闭时被调用的,但是该方法本身就是在
问题内容: 第一次运行此sql时,需要39秒,再次运行并增加SQL_NO_CACHE时,它似乎没有生效: 我在这里尝试了多种方法 甚至重新启动mysql服务器或更改表名,但我仍然不能让39秒运行此SQL 我替换了另一个SQL,并在第一次运行SQL_NO_CACHE上增加了一个,问题是一样的: 是什么原因?如何获得相同的SQL运行时? 我想找到一种方法来优化此SQL以执行39秒 顺便说一句: 不起作
问题内容: 我正在尝试使用此API用Java开发TS3 Bot:https : //github.com/TheHolyWaffle/TeamSpeak-3-Java- API 我有一个客户端所有服务器组的列表: 现在,我检查列表是否包含组: 结果是错误的。我100%确定此列表包含ServerGroup。 已经使用Sysouts进行了检查。 这是ServerGroup类的链接:[https]( h
问题内容: 我有一个Javascript函数,该函数应使用每次更新该函数时都会增加的数字来更新表单中的隐藏输入字段。 它最初与 getElementById() 一起工作,但是因为我不得不重新设计表单,所以我无法使用php函数为元素分配一个单独的ID,因此我所拥有的只是该元素的唯一名称。 因此,我决定使用Javascript中的 getElementsByName() 修改元素。 这是该元素的HT
问题内容: 请检查这个要点并告诉我,怎么了? 为什么我看不到我的留言? 要点:https : //gist.github.com/cnaize/895f61b762a9f5ee074c 如果简单,我有两个功能: 和功能: 为什么不起作用? 编辑: 我已经更新了要点。现在在哪里: 我在日志中: 但是我什么也没看到。 有任何想法吗? 问题答案: 冲洗工作正常。问题是Chrome的纯文本呈现器在显示任何