莫哈韦沙漠上的 NSProgressIndictor 问题
Problem with NSProgressIndictor on mojave
我在 sierra
os 上实现了 NSProgressIndicator
,它在 it.However 上的应用程序中运行良好,以便在我将应用程序移动到 high-sierra
时进行测试或者 mojave
,progressbar
根本不显示,而它在 sierra
上工作正常
在应用程序中单击按钮时,在按钮功能内,我启动了如下进度条,
[_progressbar startAnimation:sender];
[_progressbar setHidden:false];
当我 return 时,我将 setHidden
更改为 true
。那么,我 pos 哪里出了问题?
更新:
我尝试使用以下代码,
//Create the block that we wish to run on a different thread.
void (^progressBlock)(void);
progressBlock = ^{
[_progressbar setDoubleValue:0.0];
[_progressbar startAnimation:sender];
[_progressbar setHidden:false];
// running = YES; // this is a instance variable
//NOTE: It is important to let all UI updates occur on the main thread,
//so we put the following UI updates on the main queue.
dispatch_async(dispatch_get_main_queue(), ^{
[_progressbar setNeedsDisplay:YES];
});
// Do some more hard work here...
}; //end of progressBlock
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_async(queue,progressBlock);
我在我的旧 macOS 应用程序上注意到了这个问题,如果我没记错的话,这是在 High Sierra beta 中首次测试之后,正如您刚刚发现的那样。
大多数用户界面视图需要主线程来绘制或接收用户输入。但是,在早期的 macOS 版本中,Apple 似乎做了一些神奇的事情来让 NSProgressIndicator 显示和动画,即使主线程正忙于做其他工作。然后在最近的 macOS 版本(10.13?)中,这个魔法似乎已经被删除了。
在主线程上进行 long-running 工作从来都不是一个好主意,因为它会使您的用户界面中的其他视图(从来没有 NSProgressIndicator 魔法)对用户无响应。我认为 Apple 认为,由于我们现在都 multi-threaders Dispatch(也称为 Grand Central Dispatch),是时候移除魔法了,这是他们可能很难维护。我一直觉得它有点问题而且不可靠。
所以答案是您需要从主线程中获取进度指示器跟踪的任何工作。您可能会使用 dispatch_async() 和朋友,尽管 NSOperation 和 NSOperationQueue 仍然可以工作并且也可以完成这项工作。
我在 sierra
os 上实现了 NSProgressIndicator
,它在 it.However 上的应用程序中运行良好,以便在我将应用程序移动到 high-sierra
时进行测试或者 mojave
,progressbar
根本不显示,而它在 sierra
在应用程序中单击按钮时,在按钮功能内,我启动了如下进度条,
[_progressbar startAnimation:sender];
[_progressbar setHidden:false];
当我 return 时,我将 setHidden
更改为 true
。那么,我 pos 哪里出了问题?
更新: 我尝试使用以下代码,
//Create the block that we wish to run on a different thread.
void (^progressBlock)(void);
progressBlock = ^{
[_progressbar setDoubleValue:0.0];
[_progressbar startAnimation:sender];
[_progressbar setHidden:false];
// running = YES; // this is a instance variable
//NOTE: It is important to let all UI updates occur on the main thread,
//so we put the following UI updates on the main queue.
dispatch_async(dispatch_get_main_queue(), ^{
[_progressbar setNeedsDisplay:YES];
});
// Do some more hard work here...
}; //end of progressBlock
dispatch_queue_t queue = dispatch_get_global_queue(0,0);
dispatch_async(queue,progressBlock);
我在我的旧 macOS 应用程序上注意到了这个问题,如果我没记错的话,这是在 High Sierra beta 中首次测试之后,正如您刚刚发现的那样。
大多数用户界面视图需要主线程来绘制或接收用户输入。但是,在早期的 macOS 版本中,Apple 似乎做了一些神奇的事情来让 NSProgressIndicator 显示和动画,即使主线程正忙于做其他工作。然后在最近的 macOS 版本(10.13?)中,这个魔法似乎已经被删除了。
在主线程上进行 long-running 工作从来都不是一个好主意,因为它会使您的用户界面中的其他视图(从来没有 NSProgressIndicator 魔法)对用户无响应。我认为 Apple 认为,由于我们现在都 multi-threaders Dispatch(也称为 Grand Central Dispatch),是时候移除魔法了,这是他们可能很难维护。我一直觉得它有点问题而且不可靠。
所以答案是您需要从主线程中获取进度指示器跟踪的任何工作。您可能会使用 dispatch_async() 和朋友,尽管 NSOperation 和 NSOperationQueue 仍然可以工作并且也可以完成这项工作。