iCloud - 在其他设备上重命名打开的文档有时会失败

时间:2011-12-28 13:25:18

标签: ios iphone icloud renaming

问题:我正在设备A上处理iCloud文档,例如: iPod Touch。然后我在设备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];
       });
    }];
}

使用此代码,没有任何虚假和混乱的presentItemDidMoveToURL:调用,此外,相关对象可以侦听其他设备上的删除通知。

1 个答案:

答案 0 :(得分:6)

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

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

您需要先将文档关闭才能删除 - 在NSFilePresenter' s accommodatePresentedItemDeletionWithCompletionHandler:

中检测到