以下是相关代码的片段:
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Demo Document"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];
if (document.documentState == UIDocumentStateClosed) {
NSLog(@"file is closed");
NSLog(@"%@",[url path]);
NSDate *start = [NSDate date];
[document openWithCompletionHandler:^(BOOL success) {
if (success) {
NSLog(@"finished OPEN");
NSDate *methodFinish = [NSDate date];
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:start];
NSLog(@"time = %f",executionTime);
self.managedObjectContext = document.managedObjectContext;
}
}];
}
“文件已关闭”和“已完成打开”之间的时间间隔为16.6秒。这是正常的行为吗?编码不好?还是因为我在模拟器上运行?
我不知道它是否重要,但文件只有50KB ......
答案 0 :(得分:0)
这不是正常行为。您是否尝试在“Debug-> iCloud->删除iCloud内容”下使用Xcode 5清除所有iCloud数据?完全实现它需要几分钟,但从一个干净的石板开始可能会有所帮助。
如果您已经完成了这项工作,那么您是否看过其他可能正在使用该文档暂时保留它的内容?或者是阻止主线程的其他东西?因为在主线程的事件队列回来之前该块才会执行。
答案 1 :(得分:0)
信不信由你,这很正常。它与您的代码无关,但与您使用autosave
时或多或少的工作方式有关。这种自动保护行为实际上是默认打开/启用的(你也可以关闭它 - 但我强烈建议不要这样做,除非你需要知道你正在做什么)。
无论如何,UIManagedDocument
实际上默认情况下会自动将您的数据保存到文档存储中,而且背景不会少 - 但需要注意的是,它会在任何时候执行此操作可以(或更好,无论什么时候)。意识到它在后台为你做到这一点,所以你不必担心它(它是我真正喜欢它的一个特征 - 但也可能是他的痛苦)。
听起来您需要保存它,因为它没有显示您的数据,或者您没有看到您期望的结果。
如果是这种情况,那么我认为您应该更多地考虑如何让它实际保存您的更改,以便它可以显示在您的控制器中。实际上,它实际上与UIManagedDocument保存时几乎没有关系,更多的是关于何时更新上下文。如果确实如此,您可能会发现我对同一主题的不同主题/问题的答案很有帮助:Multiple UIManagedDocument For Read & Write
这可能是也可能不是你所追求的,但我相信它至少会让你走上正确的道路。