2013-10-15 4 views
1

У меня возникли проблемы с открытием асинхронно UIDocuments. У меня есть серия UIDocuments, созданная пользователем. Когда пользователь нажимает кнопку, мне нужно открыть некоторые документы, вытащить из них некоторые строки и объединить строки в новый файл.Открытие нескольких UID-документов в последовательности и ожидании их завершения

У меня есть массив, который отслеживает, какие документы нужно открывать. Я думал, что я должен пройти через массив, открыть каждый документ и добавить его содержимое в NSMutableString. Проблема в том, что openWithCompletionHandler выполняет свою работу асинхронно, поэтому цикл выходит вперед и заканчивается, возвращая пустую строку, прежде чем документы будут открыты (и снова закрыты).

Вот немного кода:

__block NSMutableString *combinedString; 

for (entryClass *entry in documentList) 
{ 
    MyDocumentClass *document = [[MyDocumentClass alloc] initWithFileURL:[entry fileURL]]; 

    if ([document documentState] & UIDocumentStateClosed) { 
     [document openWithCompletionHandler:^(BOOL success) { 

      if (success) { 
       [combinedString appendString:[document documentBody]]; 
      } 

      [document closeWithCompletionHandler:nil]; 
     }]; 
    } 
} 

NSLog(@"Combined String: %@", combinedString); 

Естественно, что происходит, что combinedString возвращается пустым, так как заканчивается цикл в то время как документы открываются в фоновом режиме. Я мог бы переместить обработку документа в собственный метод, который возвращает строку, но я думаю, что это все равно будет возвращено до того, как документ будет считан. По-видимому, мне придется поставить индикатор прогресса и заставить пользователя подождать - наверное, все в порядке.

ответ

0

Вы можете сделать это с помощью групп отправки. См. Разделы «Группы» и «Использование dispatch_group_t с существующим API» по адресу Low-Level Concurrency APIs.

0

Мне нужно было сделать что-то очень похожее, а не углубляться в функции низкого уровня. Я открыл документ с помощью openDocumentWithContentsOfURL:display:completionHandler:. Поскольку он передает открытый документ в completionHandler, вы можете выполнить работу по извлечению данных из документа, а затем закрыть его в блоке completionHandler.

Это предполагает, что вам все равно, в каком порядке документы будут записывать свои данные в строку, потому что теоретически completionHandlers для разных документов может быть запущен в любом порядке.

Смежные вопросы