2013-10-15 48 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可以按任意顺序运行。