Поскольку загрузка файла может быть длительной (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
, но это ничего не меняет)