莫哈韦沙漠上的NSProgressIndictor问题

时间:2019-05-07 05:19:49

标签: objective-c macos cocoa nsprogressindicator

我在NSProgressIndicator操作系统上实现了sierra,它在其上的应用程序中运行良好。但是,为进行测试,当我将应用程序移至high-sierramojave时, progressbar完全不显示,但在sierra上可以正常使用

在应用程序中单击按钮时,在按钮功能内部,我按如下所示启动进度条,

[_progressbar startAnimation:sender];
[_progressbar setHidden:false];

当我返回时,将setHidden更改为true。那么,我可能在哪里出错?

更新: 我尝试使用以下代码,

 //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);

1 个答案:

答案 0 :(得分:1)

我在旧的macOS应用程序上注意到了这个问题,如果我没记错的话,那是在您刚刚发现的High Sierra beta中进行首次测试之后。

大多数用户界面视图都需要主线程来绘制或接收用户输入。但是,似乎在早期的macOS版本中,即使主线程忙于其他工作,Apple还是做了一些魔术来使NSProgressIndicator显示和设置动画。然后在最新的macOS版本(10.13?)中,这种魔力似乎已被删除。

在主线程上进行长时间运行从来都不是一个好主意,因为它会使用户界面中的其他视图(从来没有NSProgressIndicator魔术)对用户无响应。我认为Apple认为,由于我们现在都是Dispatch(也称为 Grand Central Dispatch )的多线程用户,因此该删除魔术了,这对于他们来说可能很难保持。我总会发现它有些故障且不可靠。

所以答案是,您需要完成进度指示器正在跟踪的所有工作。尽管NSOperation和NSOperationQueue仍然可以使用,但您可能仍将使用dispatch_async()和朋友。