我正在处理云中的文档...... *将文档添加到云中 *从云中删除该文档 *不知何故,该文件几秒钟后重新出现。
以下是详细信息:
我像这样创建一个UIDocument实例
NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:@"somenewfilename"];
MyDoc* docTemp = [[MyDoc alloc] initWithFileURL:ubiquitousPackage];
docTemp.mapContent = [NSString stringWithString:self.currentdocument.mapContent];
[docTemp saveToURL:[docTemp fileURL]
forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success) {
if (success) {
DLog(@"New document %@ saved/added: %@", newFilename, docTemp);
}
else {
DLog(@"Failed saving new document: %@", newFilename);
}
[docTemp release];
}];
然后像这样删除它:
NSURL* fileURL = self.currentdocument.fileURL;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSFileCoordinator* fileCoordinator = [[NSFileCoordinator alloc] initWithFilePresenter:nil];
NSError* error = nil;
[fileCoordinator coordinateWritingItemAtURL:fileURL options:NSFileCoordinatorWritingForDeleting error:&error byAccessor:^(NSURL* writingURL) {
if (error != nil) {
DLog(@"Error with %@! %@", fileURL, error);
return;
}
DLog(@"Got writingURL: %@", writingURL);
NSFileManager* fileManager = [[NSFileManager alloc] init];
if ([fileManager removeItemAtURL:writingURL error:nil]) {
DLog(@"Deleted %@!", writingURL);
}
else {
DLog(@"ERROR Failed deleting %@!", self.currentdocument);
}
[fileManager release];
[fileCoordinator release];
}];
});
现在尽管做了以上操作,看起来文件被删除了(短),但是有几次,删除的文件会在一秒或几秒后重新出现在云端。 (我可以通过其他设备上的iCloud设置或通过更新发送通知的查询来检查)。仅在某些情况下文件仍然被删除。发生了什么事?
我应该注意,即使从Settings-> iCloud删除文件也会导致上述模式。几秒后,该文件神奇地重新出现。时间问题?同步问题?
答案 0 :(得分:9)
不要在文档打开时删除它们。 :-P
答案 1 :(得分:3)
这方面的一个可能的问题来源是你的UIDocument的documentState在删除时依次经过这些状态...
8(UIDocumentStateEditingDisabled)
然后0(UIdocumentStateNormal)可能更新文件名,
然后4(UIDocumentStateSavingError)删除。
因此,当您收到UIDocumentStateChangedNotification表示状态正常时,删除可能会对您的代码进行攻击。
我希望这有助于某人。
更新
而不是尝试从DocumentState驱动所有内容,因为我尝试了一个月未成功(遵循Wenderlich示例)......
对我来说,关键是将 tolePresentedItemDeletionWithCompletionHandler 添加到子类UIDocument,其中包含closeWithCompletionhandler:调用,在检测到删除时关闭所有设备上的打开文件。然后,它会向我的经理发布通知,以从源数据阵列中删除此项的实例。
这似乎更加强大和可预测。我仍然看到删除后有几个DocumentState 8和State 9到达每个设备,我希望只看到一个,但这可能是一个不同的问题。
答案 2 :(得分:1)
在我的情况下,“accomPresentedItemDeletionWithCompletionHandler:”通过在无意识地打开UIDocument时强制关闭来阻止一次删除文件重新出现。 您可以在此处查看其使用情况:iCloud - renaming open documents on another device sometimes fails