Macos 如何更新NSProgressIndicator?
我对程序有问题。问题是NSProgressIndicator在过程中没有更新,并且在过程结束时只显示一小部分已完成的内容。localizedDescription也仅在流程结束时显示,但已100%完成 所以,我有一个类,它有一个方法findRepeatsWithProgressReporting,使用NSProgress 然后,在MyVEWControler中,我使用repeatsProgress.becomeCurrentwithPendingUnitCount:10将parentProgress RepeatsProgressReporting as childProgress方法的任务添加到parentProgress repeatsProgress中,并使用repeatsProgress.becomeCurrentwithPendingUnitCount:10 最后一部分针对KVO:Macos 如何更新NSProgressIndicator?,macos,swift3,nsprogressindicator,nsprogress,Macos,Swift3,Nsprogressindicator,Nsprogress,我对程序有问题。问题是NSProgressIndicator在过程中没有更新,并且在过程结束时只显示一小部分已完成的内容。localizedDescription也仅在流程结束时显示,但已100%完成 所以,我有一个类,它有一个方法findRepeatsWithProgressReporting,使用NSProgress 然后,在MyVEWControler中,我使用repeatsProgress.becomeCurrentwithPendingUnitCount:10将parentProgre
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`
}