我有线程问题,我就是搞不清楚。
private func addTextToOutputView(_ text: String){
var t = text
DispatchQueue.main.async {
var recentText = self.outputTextView.text
self.responseLogQueue.async {
if let firstChar = t.first, let index = t.index(of: firstChar) {
if firstChar == "n" {
let subS = t[index...]
t = String(subS)
}
}
}
let currentTime = Date()
let currentTimeString = self.dateFormatter.string(from: currentTime)
t = "n(currentTimeString) (t)"
recentText?.append(t)
self.outputTextView.text = recentText
if self.isScenarioOuputRunning {
if self.outputTextView.text.count > 0 {
let bottom = NSMakeRange(self.outputTextView.text.count-1, 1)
self.outputTextView.scrollRangeToVisible(bottom)
}
}
}
}
连接到发送大量数据且速度快的BLE设备。
我需要按数据到达的顺序显示数据。
这一直有效到某个时候,当数据太多时,应用程序就会陷入困境。
我只是不知道如何设置它,即我将获得已经显示的数据(需要在主队列上这样做吗?(,然后操作它(在我自己的后端队列上(,然后再次在屏幕上显示连接的数据(文本视图(。
我尝试过的任何东西都没有做到,如果我封装在一个全局队列(我的队列(中,然后只调用主队列中的get和set部分,我就会丢失部分数据,通过这种方式,我可以正确地获取所有数据,但由于我拥有大量数据,应用程序会在某个点上陷入
有人看到问题了吗?
令人不安的是,在OBJ-C中,相同的代码(逻辑-逐行(确实工作得很好!
您的代码没有多大意义;您正在将一些更新t
的代码分派到另一个队列中,但随后在当前线程中使用t
来更新文本视图。此外,您发送到responseLogQueue
上的代码有效地执行t = String(t)
我建议您不要将文本视图本身用作数据模型;它应该只是存储在字符串属性中的文本的视图。您可以使用串行调度队列来更新此字符串属性,并使用计时器定期刷新UI:
class SomeViewController {
var outputTextView: UITextView!
private var refreshTimer: Timer?
private var outputText = ""
private var responseLogQueue: DispatchQueue!
override func viewDidLoad() {
super.viewDidLoad()
self.responseLogQueue = DispatchQueue(label:"ResponseLogQueue")
self.timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { [weak self] (timer) in
guard let strongSelf = self else {
return
}
if self.isScenarioOuputRunning && !strongSelf.outputText.isEmpty {
strongSelf.outputTextView.text = strongSelf.outputText
let bottom = NSMakeRange(strongSelf.outputTextView.text.count-1, 1)
strongSelf.outputTextView.scrollRangeToVisible(bottom)
}
})
}
private func addTextToOutputView(_ text: String) {
let currentTimeString = self.dateFormatter.string(from: Date())
let newText = "n(currentTimeString) (text)"
self.responseLogQueue.async {
self.outputText = self.outputText.append(newText)
}
}
}