Проблема с NSProgressIndictor на мохаве - PullRequest
1 голос
/ 07 мая 2019

Я реализовал NSProgressIndicator на sierra ОС, и он прекрасно работал в приложении на нем. Однако для тестирования, когда я переместил приложение в high-sierra или mojave, 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 Ответ

1 голос
/ 07 мая 2019

Я заметил эту проблему в моих старых приложениях macOS, и, если я правильно помню, это было после первого тестирования в бета-версиях High Sierra, как вы только что обнаружили.

Большинству представлений пользовательского интерфейса необходим главный поток для рисования или получения пользовательского ввода. Но, похоже, что в более ранних версиях macOS Apple сделала что-то волшебное, чтобы NSProgressIndicator отображал и анимировал, даже если основной поток был занят другой работой. Затем в последних версиях macOS (10.13?) Эта магия, похоже, была удалена.

Никогда не было хорошей идеей выполнять длительную работу с основным потоком, поскольку это делает другие представления в вашем пользовательском интерфейсе, у которых никогда не было волшебства NSProgressIndicator, безразличным для пользователя. Я думаю, что Apple решила, что, поскольку мы все теперь являемся многопоточными с Dispatch (также называемым Grand Central Dispatch ), пришло время удалить магию, что, вероятно, было трудно поддерживать. Я всегда находил, что это несколько глючит и ненадежно.

Таким образом, ответ таков: вам нужно получить любую работу, которую индикатор прогресса отслеживает в основном потоке. Вероятно, вы будете использовать dispatch_async () и друзей, хотя NSOperation и NSOperationQueue все еще работают и будут выполнять эту работу.

...