连续打开几个UIDocuments并等待它们完成

我无法绕过UIDocuments异步打开的方式。 我有一系列用户创建的UIDocuments。 当用户按下按钮时,我需要打开一些文档,从中拉出一些字符串,并将字符串连接成一个新文件。

我有一个数组,可以跟踪需要打开的文档。 我的想法是我应该遍历数组,打开每个文档,并将其内容附加到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); 

当然会发生的是,combineString返回空,因为循环在文档在后台打开时完成。 我可以将文档处理移动到自己的方法,该方法返回一个字符串,但我认为在读取文档之前它仍然会返回。 我可能必须提出一个进度指示器并让用户等待 – 这可能没问题。

您可以使用调度组执行此操作。 请参阅低级并发API中的 “组”和“使用dispatch_group_t与现有API”部分。

我必须做一些非常相似的事情而不是钻研低级函数我用openDocumentWithContentsOfURL:display:completionHandler:打开文档openDocumentWithContentsOfURL:display:completionHandler: . 因为它将打开的文档传递给completionHandler您可以从文档中提取数据,然后在completionHandler块中将其关闭。

这假设您不关心文档将数据写入字符串的顺序,因为理论上不同文档的completionHandlers可以按任何顺序运行。