问题:我正在设备A上编写一个iCloud文档,例如iPod Touch。然后我在设备B上更改文档的名称,例如我的Mac (通过Finder)。变化上升到云端,暂停后,设备A就可以听到它了。
然后:
有些时候,
fileURL属性获取名称的更改,并可以相应地更新我的接口--文档的行为仍然像在某些时候file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-012fdcfbe3b3bbce6e603fdfd2f000b2cb28649e95,不奇怪这个文件不会保存。有人能解释一下发生了什么事,以及如何解决这个问题吗?
背景
,
NSMetadataQuery很好地记录下来。因此,例如,我可以重命名未打开的文档,并且我的所有iCloud功能都可以正常工作。这个问题似乎只在打开的documents.presentedItemDidMoveToURL:覆盖时,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:调用,此外,相关对象还可以侦听其他设备上的删除通知。
发布于 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:中检测到这一点
https://stackoverflow.com/questions/8656504
复制相似问题