首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iCloud -在另一个设备上重命名打开的文档有时会失败

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

Stack Overflow用户
提问于 2011-12-28 13:25:18
回答 1查看 1.3K关注 0票数 5

问题:我正在设备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功能都可以正常工作。这个问题似乎只在打开的documents.
  • Other iCloud功能正常工作时才会出现,例如,我可以在一个设备上更改内容,例如Mac,然后检测并更新打开相关iCloud文档的另一个设备上的接口,例如iPod Touch。当我在UIDocument子类中添加一个presentedItemDidMoveToURL:覆盖时,
  • 第一次注意到了这一点。覆盖可靠地获取云中所做的名称更改,例如在另一个设备上重命名文档。有时,purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95.
  • (void)是重命名文档的最终预期URL,例如,我可以从中提取新名称--使用‘`lastPathComponent',更新我的接口等等。在其他情况下,newURL是其他目录中的一个文档,其中最后一个路径组件以'purg-’开头,例如respondsToSelector:@selector(documentNameChanged:)]) presentedItemDidMoveToURL:(NSURL *) newURL;{ sometimes : newURL;if ([(id)self委托respondsToSelector:@selector(documentNameChanged:)]){ [self委托documentNameChanged: self];}
  • presentedItemDidMoveToURL:方法似乎不是问题的根源。例如,如果我根本不覆盖该方法,而是定期签入负责处理打开的文档的viewController,那么有时在重命名fileURL之后将返回新名称,有时它将返回``purg.‘。因此,问题似乎与如何处理重命名有关。

更新

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

代码语言:javascript
复制
    - (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:调用,此外,相关对象还可以侦听其他设备上的删除通知。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-13 06:50:59

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

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

在文档被删除之前,您需要先关闭它--在NSFilePresenter的accommodatePresentedItemDeletionWithCompletionHandler:中检测到这一点

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8656504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档