2013-10-15 89 views
1

我在開始異步打開UID文件的過程中遇到了困難。我有一系列用戶創建的UID文檔。當用戶按下一個按鈕時,我需要打開一些文檔,從中拉出一些字符串,並將這些字符串連接成一個新文件。連續打開幾個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

你可以用調度組來做到這一點。請參閱Low-Level Concurrency APIs中的「組」和「在現有API中使用dispatch_group_t」部分。

0

我不得不做一些非常相似的事情,而不是鑽研低級功能,我用openDocumentWithContentsOfURL:display:completionHandler:打開文檔。由於它將打開的文檔傳遞到completionHandler,因此您可以執行從文檔中提取數據的工作,然後在completionHandler塊中關閉它。

這假定你不在乎文件將數據寫入字符串的順序是什麼,因爲理論上不同文檔的completionHandlers可以按任意順序運行。