swift - Label 和 ProgressBar 不会更新 macOS Swift

标签 swift xcode macos label progress-bar

我今天的代码有问题。我尝试在 for 循环内更新标签和进度 View ,但标签或进度条都没有更新。

我不明白为什么......如果你能处理的话,这是代码

    func parseMessage()
    {
        var i = 0

        self.beginHTML()

        for row in (try? db?.prepare("SELECT message.text, message.is_from_me, datetime(substr(message.date, 1, 9) + 978307200, 'unixepoch', 'localtime') as f_date, message.cache_has_attachments, message.ROWID FROM message LEFT JOIN chat WHERE chat.guid LIKE '%PHONENUMBER%' AND chat.ROWID == message.handle_id"))!!
        {
            html += """
            <div class=\"clear\"></div>
            <p align=\"center\"> \(String(describing: row[2] ?? "")) </p>
            """

            if (row[3] as! Int64 == 1)
            {
                self.parseAttachments(row: row)
            }
            else if (row[1] as! Int64 == 1)
            {
                html += "<div class=\"from-me\"> <p>\(String(describing: row[0] ?? "")) </p></div>"
            }
            else
            {
                html += "<div class=\"from-them\"> <p>\(String(describing: row[0] ?? "")) </p></div>"
            }

            i = i + 1

            if (i % 500 == 0)
            {
                self.progressLabel.stringValue = "\(i) on \(self.messageNumber)"
                self.progressBar.increment(by: 500)

//                DispatchQueue.main.async {
//                    self.progressLabel.stringValue = "\(i) on \(self.messageNumber)"
//                    self.progressBar.increment(by: 500)
//                }
            }

            if (i == 2000)
            {
                break;
            }
        }

        html += "</section></body></html>"
    }

我的全部代码在这里:https://github.com/ExPl0siF/iOSMessageExport/blob/master/MessageGenerator/ViewController.swift

最佳答案

您不能在主线程上运行 for 循环并显示 UI 更新。直到您的代码返回并且应用服务于主事件循环后,才会发生 UI 更改。

相反,如果您发布的代码在后台线程(它可能应该是)上运行,那么您需要在对 DispatchQueue.main 的调用中包装 UI 更新(对标签和进度条的更改)。异步()

编辑:试试这个改变:

func parseMessage()
{
    DispatchQueue.global().async {
        var i = 0
        
        self.beginHTML()
        
        for row in (try? db?.prepare("SELECT message.text, message.is_from_me, datetime(substr(message.date, 1, 9) + 978307200, 'unixepoch', 'localtime') as f_date, message.cache_has_attachments, message.ROWID FROM message LEFT JOIN chat WHERE chat.guid LIKE '%PHONENUMBER%' AND chat.ROWID == message.handle_id"))!!
        {
            html += """
            <div class=\"clear\"></div>
            <p align=\"center\"> \(String(describing: row[2] ?? "")) </p>
            """
            
            if (row[3] as! Int64 == 1)
            {
                self.parseAttachments(row: row)
            }
            else if (row[1] as! Int64 == 1)
            {
                html += "<div class=\"from-me\"> <p>\(String(describing: row[0] ?? "")) </p></div>"
            }
            else
            {
                html += "<div class=\"from-them\"> <p>\(String(describing: row[0] ?? "")) </p></div>"
            }
            
            i = i + 1
            
            if (i % 500 == 0)
            {
                DispatchQueue.main.async {
                    self.progressLabel.stringValue = "\(i) on \(self.messageNumber)"
                    self.progressBar.increment(by: 500)
                }
            }
            
            if (i == 2000)
            {
                break;
            }
        }
        
        html += "</section></body></html>"
    }
}

关于swift - Label 和 ProgressBar 不会更新 macOS Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455636/

相关文章:

ios - 隐式转换失去整数精度Xcode 5.1

ios - 导出或提交到 App Store 时 Xcode 崩溃

objective-c - 以编程方式调整 NSSplitView 的大小

python - 多个 Django 版本 - virtualenv 仍然是一个不错的选择吗?

ruby - PATH 中的不安全世界可写目录/用户/用户名,运行 Ruby 命令时模式 040777

python - 使 Sublime Text 3 成为 Python 文件的默认编辑器。 MAC 操作系统 : El Capitan OS

swift - SceneKit – 来自定向光的阴影取决于相机角度

ios - 如何将值附加到模型类

ios - 尽管尝试了官方 SO 答案的所有方法,但我找不到我的 .realm 文件

swift - 上传多个图像进行解析