同步打开 UIDocument

Posted

技术标签:

【中文标题】同步打开 UIDocument【英文标题】:Open UIDocument synchronously 【发布时间】:2014-04-18 09:44:38 【问题描述】:

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

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

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

为了更好地理解这个问题,让我大致描述一下我的应用正在使用哪些文档之王:

每个活动用户一个文档(不同用户可以登录/注销) 每个用户 + 每年一个文档(应用可以显示选定的年份) 每个用户 + 每年多个数据文档 还有一些元数据文档,它们都只能在内存中加载一次(这里没问题)

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

用户文档将始终打开并加载到内存中,我在这里看不到问题。对于其他文档,这并不容易,因为我需要即时加载它们,也可能是来自其他当前未激活的用户的文档(这消除了将当前用户的所有文档加载到内存中的可能性)。

那么,我的主要问题是,处理大量文档的好方法是什么?

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

是否有任何同步 API,或为 UIDocument 强制同步/同步 API 包装器的示例?

【问题讨论】:

我不知道这是否会有所帮助,但这是another question 【参考方案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];
    

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

【讨论】:

以上是关于同步打开 UIDocument的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firefox 89 中打开同步设备中的所有选项卡?

与其他数据库同步 mailchimp 活动的点击和打开

Android adb“无法打开同步连接!”

CoreData + CloudKit 仅在最小化和重新打开应用程序后同步

codecs打开不同步给编码的文件

Navicat 数据传输和数据同步的区别