Отображение окна во время инициализации NSDocumentSubclass - PullRequest
0 голосов
/ 28 июня 2018

Поскольку загрузка файлов может быть продолжительной (15-20 с для больших текстовых файлов), я хотел бы отобразить окно ожидания с неопределенным NSProgressIndicator, чтобы помочь пользователю быть терпеливым. Я создал перо и оконный контроллер для этого. Проблема заключается в отображении этого окна на экране во время недавней загрузки файла при запуске приложения. В makeWindowControllers NSDocumentSubclass я поместил следующий код:

...    
dispatch_async(dispatch_get_main_queue(), ^(){
        self->progressController = [[ProgressViewWindowController alloc] initWithWindowNibName:@"ProgressViewWindowController"];
        [self->progressController.progressIndicator setUsesThreadedAnimation:YES];
        [self->progressController.progressIndicator startAnimation:self];
        [self->progressController showWindow:self];
    });
...

И в initForURL:(NSURL *)urlOrNil withContentsOfURL:... я поставил следующий код в конце:

self.content = [[NSMutableString alloc] initWithContentsOfURL:self.fileURL encoding:encoder  error:&error];
dispatch_async(dispatch_get_main_queue(), ^(){
    [self->progressController close];
});

Но окно отображается только после того, как NSDocumentSubclass завершил загрузку, и его содержимое отображается на экране, а не раньше. Таким образом, вызов close никогда не выполняется (я предполагаю, что он вызывается до того, как окно было отображено). Если я удаляю блок dispatch_async…, то ничего не отображается вообще, ни по времени, ни с задержкой.

Как я могу отобразить это окно, когда я его спрашиваю? Должен ли я заменить синхронный метод [[NSMutableString alloc] initWithContentsOfURL:self.fileURL encoding:encoder error:&error]; на асинхронный, чтобы освободить время в главном потоке? Как я могу прочитать строку в файле асинхронно? (Я проверял одновременное чтение файла при возврате YES в + (BOOL) canConcurrentlyReadDocumentsOfType:(NSString *)typeName, но это ничего не меняет)

1 Ответ

0 голосов
/ 29 июня 2018

Если тот же код используется в делегате приложения вместо NSDocumentControllerSubclass, окно отображается правильно.

...