问题:我正在设备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功能都可以正常工作。只有打开的文档才会出现这个问题。
其他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:调用,此外,相关对象可以侦听其他设备上的删除通知。
答案 0 :(得分:6)
当在本地打开UIDocument并从远程设备删除时,会出现此类型的URL:
file://localhost/var/mobile/Library/Mobile%20Documents/.ubd/peer-43A0AEB6-84CE-283E-CA39-FCC4EF3BC8F8-v23/ftr/purg-
您需要先将文档关闭才能删除 - 在NSFilePresenter' s accommodatePresentedItemDeletionWithCompletionHandler: