莫哈韦沙漠上的 NSProgressIndictor 问题

Problem with NSProgressIndictor on mojave

我在 sierra os 上实现了 NSProgressIndicator,它在 it.However 上的应用程序中运行良好,以便在我将应用程序移动到 high-sierra 时进行测试或者 mojaveprogressbar 根本不显示,而它在 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 仍然可以工作并且也可以完成这项工作。