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