Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何更新NSProgressIndicator?_Macos_Swift3_Nsprogressindicator_Nsprogress - Fatal编程技术网

Macos 如何更新NSProgressIndicator?

Macos 如何更新NSProgressIndicator?,macos,swift3,nsprogressindicator,nsprogress,Macos,Swift3,Nsprogressindicator,Nsprogress,我对程序有问题。问题是NSProgressIndicator在过程中没有更新,并且在过程结束时只显示一小部分已完成的内容。localizedDescription也仅在流程结束时显示,但已100%完成 所以,我有一个类,它有一个方法findRepeatsWithProgressReporting,使用NSProgress 然后,在MyVEWControler中,我使用repeatsProgress.becomeCurrentwithPendingUnitCount:10将parentProgre

我对程序有问题。问题是NSProgressIndicator在过程中没有更新,并且在过程结束时只显示一小部分已完成的内容。localizedDescription也仅在流程结束时显示,但已100%完成

所以,我有一个类,它有一个方法findRepeatsWithProgressReporting,使用NSProgress

然后,在MyVEWControler中,我使用repeatsProgress.becomeCurrentwithPendingUnitCount:10将parentProgress RepeatsProgressReporting as childProgress方法的任务添加到parentProgress repeatsProgress中,并使用repeatsProgress.becomeCurrentwithPendingUnitCount:10

最后一部分针对KVO:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{
        guard context == &progressObservationContext else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }

    if keyPath == "fractionCompleted"
    {
        OperationQueue.main.addOperation{
                let progress = object as! Progress
                self.repeatsSearchProgressBar.doubleValue = progress.fractionCompleted
                self.repeatsPercentText.stringValue = progress.localizedDescription
        }
    }
}
我补充说

print("Observed Something")
内部

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{  ...

我看到的是在开始后立即打印观察到的东西两次,在结束时打印六次,在这两次之间没有打印,正如更新过程中预期的那样。原因可能是什么

这似乎是一个并发问题。由于func actionFindRepeats\uSender:AnyObject在主线程中运行,因此它与UI更新一致,这将直接影响NSProgressIndicator

请参见该答案的最后一个示例,以了解有关该答案的更多详细信息:

您可以尝试将actionFindRepeats函数的所有内容添加到该块中,看看它是否有效:

DispatchQueue.global().async {
    // qos' default value is ´DispatchQoS.QoSClass.default`
}
该区块的参考:


谢谢你的建议!我只为上述任务做了一个测试项目,搜索带有进度报告的字符串中的重复。所有操作都在AppDelegate中完成。我已经按照您的建议添加了DispatchQueue.global.async,现在在这个项目中,我看到在流程结束时完成了NSProgressIndicator,100%完成了本地化描述。在主项目中,我为同一个任务使用了单独的控制器,但仍然是同一个不完整的NSProgressIndicator。而且,在这两个项目中,我没有更新NSProgressIndicator,没有中间百分比。现在在这两个项目中,在我做了更改之后,我在测试项目中也有以下警告:2017-03-24 19:39:55.202 Test2[3926:127626]未限制的CATTransaction。将环境中的CA_DEBUG_TRANSACTIONS=1设置为DEBUG。CoreAnimation:警告,已删除未提交CATTransaction的线程;在环境中设置CA_DEBUG_TRANSACTIONS=1以记录回溯。我发现您的建议是解决此问题的正确答案,再次感谢,我接受您的回答。
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
{  ...
DispatchQueue.global().async {
    // qos' default value is ´DispatchQoS.QoSClass.default`
}