gpt4 book ai didi

ios - iCloud - 在另一台设备上重命名打开的文档有时会失败

转载 作者:可可西里 更新时间:2023-11-01 04:36:33 26 4
gpt4 key购买 nike

问题:我正在设备 A 上处理 iCloud 文档,例如iPod 触摸。然后我更改设备 B 上文档的名称,例如我的 Mac(通过 Finder)。更改会上传到云端,在暂停后设备 A 会听到它。

然后:

  • 有时一切都很好 - 我通过更改的 fileURL 属性获取名称更改,并可以相应地更新我的界面 - 文档继续按应有的方式运行
  • 有时,文档的 fileURL 返回如下:file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39- FCC4EF3BC8F8-v23/ftr/purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95 毫不奇怪,这个文件不会保存。

谁能解释发生了什么以及如何解决它?

背景

  • NSMetadataQuery 可以很好地获取名称更改。因此,例如,我可以重命名未打开的文档,并且我的所有 iCloud 功能都可以正常工作。该问题似乎只出现在打开的文档中。

  • 其他 iCloud 功能运行良好,例如我可以更改一台设备上的内容,例如我的 Mac,然后在另一台设备上检测并更新我的界面,例如我的 iPod Touch,打开了相关的 iCloud 文档。

  • 当我为我的 UIDocument 子类添加 presentedItemDidMoveToURL: 的覆盖时,我首先发现了这一点。覆盖可靠地获取在云中所做的名称更改,例如在另一台设备上重命名文档。然后 有时 newURL 是重命名文档的最终预期 URL,即我可以使用“lastPathComponent”从中提取新名称、更新我的界面等的一些合理的东西。在其他情况下,newURL 是一些文档最后一个路径组件以“purg-”开头的其他目录,例如purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95.

    - (void) presentedItemDidMoveToURL:(NSURL *) newURL;
    {
    [super presentedItemDidMoveToURL: newURL];

    if ([(id)[self delegate] respondsToSelector:@selector(documentNameChanged:)])
    {
    [[self delegate] documentNameChanged: self];
    }
    }
  • presentedItemDidMoveToURL: 方法似乎不是问题的根本原因。例如,如果我根本不重写该方法,而是定期检查正在打开文档的 viewController,则 有时 在重命名 fileURL 后将返回新名称和有时它会返回“purg-.....”。所以问题似乎与重命名的处理方式有关。

更新

正如 al_lea 所指出的,这里的问题与 accommodatePresentedItemDeletionWithCompletionHandler: 有关。扩展 al_lea 的答案,我将下面的代码添加到我的 UIDocument 子类中。这解决了这个问题。

    - (void) accommodatePresentedItemDeletionWithCompletionHandler: (void (^) (NSError *errorOrNil)) completionHandler
{
PresentedDocument* presentedDocument = [self retain];
[presentedDocument closeWithCompletionHandler: ^(BOOL success) {
NSError* error = nil;
if (!success)
{
NSDictionary* userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
@"Could not close document that is being deleted on another device",
NSLocalizedDescriptionKey, nil];
error = [NSError errorWithDomain: @"some_suitable_domain"
code: 101
userInfo: userInfo];
}

completionHandler(error); // run the passed in completion handler (required)

dispatch_async(dispatch_get_main_queue(), ^
{
[[NSNotificationCenter defaultCenter] postNotificationName: NOTIFY_presentedDocumentDeletedOnAnotherDevice
object: presentedDocument
userInfo: nil];

[presentedDocument tidyUpAfterDelete]; // app specific tidy up
[presentedDocument release];
});
}];
}

有了这段代码,就没有虚假和令人困惑的 presentedItemDidMoveToURL: 调用,此外,相关对象可以监听其他设备上的删除通知。

最佳答案

当 UIDocument 在本地打开并从远程设备上删除时,会出现这种类型的 URL:

file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-

您需要在文件被删除之前先关闭它 - 在 NSFilePresenter 的 accommodatePresentedItemDeletionWithCompletionHandler:

中检测到这一点

关于ios - iCloud - 在另一台设备上重命名打开的文档有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8656504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com