Отображение окна во время инициализации NSDocumentSubclass

Поскольку загрузка файла может быть длительной (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 и отображения его содержимого на экране, а не раньше. Таким образом, вызов закрытия никогда не выполняется (я полагаю, что он вызывается до отображения окна). Если убрать блок dispatch_async…, то вообще ничего не отображается ни по времени, ни с задержкой.

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


person Denis    schedule 28.06.2018    source источник


Ответы (1)


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

person Denis    schedule 29.06.2018