同步打开UIDocument

时间:2014-04-18 09:44:39

标签: ios objective-c asynchronous uidocument

我目前正在使用UIDocument子类将我现有的应用程序从CoreData存储重新设计为基于文档的应用程序。这主要是为了能够引入iCloud同步,因为CoreData中存在iCloud同步问题。

在某些地方,我可以轻松地将CoreData使用替换为相应的UIDocument处理,但在某些地方,我真的很难用异步代码替换同步代码。主要是当我需要动态打开一些文档时,只能快速访问,例如在计算过程中。

我已经实施了调度组,等待UIDocument操作,但在某些地方这似乎不合适。例如。当需要按顺序打开大量文档来完成计算时,这将导致块和调度组的链接非常复杂和奇怪。

为了更好地理解这个问题,让我粗略地描述我的应用程序使用的文档之王:

  • 每个活跃用户一个文档(不同的用户可以登录/注销)
  • 每位用户+每年一份文件(应用程序可以显示所选年份)
  • 每位用户+每年多份数据文件
  • 一些元数据文档只能在内存中加载一次(这里没问题)

所以基本上,对于1个用户和2年的应用程序使用,可以有大约50个文档需要按需显示,并用于计算。

用户文档将始终打开并加载到内存中,我在这里看不到问题。对于其他文档,它不是那么容易,因为我需要动态加载它们,也可能是其他用户当前不活动的文档(这样就无法在内存中加载当前用户的所有文档)。

所以,我的主要问题是,处理大量文件的好方法是什么?

我敢打赌,将所有文档加载到内存中也是一个坏主意,同样也是关于iCloud同步。

是否存在UIDocument的同步API或强制同步/同步API包装的示例?

1 个答案:

答案 0 :(得分:1)

您可以通过强制当前线程在某个条件下等待来同步打开多个文档:

- (void)openDocumentsSynchronously:(NSArray *)documents
{
    __block NSUInteger waitingOnDocuments = documents.count;
    NSCondition *condition = [NSCondition new];

    for (UIDocument *document in documents)
    {
        [document openWithCompletionHandler:^(BOOL success) {

            waitingOnDocuments--;

            [condition lock];
            [condition broadcast];
            [condition unlock];
        }];
    }

    while (waitingOnDocuments > 0)
    {
        [condition lock];
        [condition wait];
        [condition unlock];
    }
}

我不建议在主线程上执行此操作,因为文档可能需要一段时间才能打开。