gpt4 book ai didi

ios - Swift 处理大量数据并使用队列正确显示

转载 作者:行者123 更新时间:2023-11-28 05:56:48 25 4
gpt4 key购买 nike

我遇到了无法解决的线程问题。

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 设备。

我需要按数据到达的顺序显示数据。

这个工作会一直持续到某一点,当数据过多时,应用程序就会卡住。

我只是不知道如何设置它,我将获得已经显示的数据(需要在主队列上这样做吗?)然后操作它(在我自己的后端队列上)然后显示到串联数据再次显示到屏幕( TextView )。

我尝试过的任何事情都没有做到,如果我封装在一个全局队列(我的队列)中,然后只调用主队列中的 get 和 set 部分,我将丢失部分数据,并且在通过这种方式,我可以正确获取所有数据,但由于我拥有大量数据,应用程序会卡在某个点

有人看到这个问题了吗?

令人不安的是,在 OBJ-C 中,相同的代码(逻辑 - 逐行)运行良好!

最佳答案

你的代码没有多大意义;您正在分派(dispatch)一些更新 t 的代码到另一个队列,然后在当前线程中使用 t 来更新 TextView 。此外,您分配到 responseLogQueue 的代码有效地执行了 t = String(t)

我建议您不要将 textview 本身用作数据模型;它应该只是您文本的一个 View ,它存储在一个字符串属性中。您可以使用串行调度队列来更新此字符串属性,并使用计时器来定期刷新 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)
}
}
}

关于ios - Swift 处理大量数据并使用队列正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51282751/

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