2

我正在像这样解码几千兆字节的 JSON 编码数据

let decoder = JSONDecoder()
let table = try decoder.decode([LogRow].self, from: content!)

content纯文本在哪里。现在,此操作可能需要几分钟,具体取决于 的大小content,我想展示一些进展。这是一个命令行程序,所以即使是定期更新长度table也足够了。问题是我没有看到类似回调或类似的东西。Timer我尝试过这样一个相当尴尬的

var table: [LogRow]? = []
let timer = Timer(fire: Date(), interval: 1.0, repeats: true) { t in
    print("\(table?.count ?? 0) rows parsed.")
}
timer.fire()
table = try decoder.decode([LogRow].self, from: content!)
timer.invalidate()

但这只运行一次——是因为解码器阻塞了主线程而我在同一个线程中运行计时器吗?我对 GCD 有点陌生,所以我不知道如何使用 a 来做DispatchQueue这个。

有任何想法吗?

4

1 回答 1

1

然后可以像这样声明你的计时器:

    let timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.updateUI), userInfo: nil, repeats: true)
    DispatchQueue.global(qos: .background).async {
        self.perform(#selector(self.decode), on: Thread.current, with: nil, waitUntilDone: true)
        timer.invalidate()
    }

这意味着您希望updateUI每秒触发一次操作。然后你开始decode在后台线程中等待直到完成,然后再使你的计时器失效。

var totalDuration: Int = 0

@objc func updateUI () {
    self.currentDuration += 1
    print("------------> \(self.currentDuration)")
}

@objc func decode () {
    table = try decoder?.decode([LogRow].self, from: content!)
}

我添加了一个currentDuration可以在你的progressBar 中使用的变量。但是,如果您需要向用户显示百分比,则必须知道总持续时间。

于 2017-10-18T13:37:35.590 回答