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

时间:2013-10-15 14:22:11

标签: ios objective-c uidocument

我无法绕过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);

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

2 个答案:

答案 0 :(得分:0)

您可以使用调度组执行此操作。请参阅Low-Level Concurrency APIs上的“论坛”和“使用dispatch_group_t与现有API”部分。

答案 1 :(得分:0)

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

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