1

下面是一段相关代码:

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 ......

4

2 回答 2

0

这不是正常行为。您是否尝试过在“Debug->iCloud->Delete iCloud Contents”下使用 Xcode 5 清除所有 iCloud 数据?完全实现需要几分钟的时间,但从零开始可能会有所帮助。

如果您已经这样做了,您是否查看过其他可能正在处理暂时保留的文档?还是有其他东西阻塞了主线程?因为在主线程的事件队列回来之前,该块不会执行。

于 2013-09-06T02:00:12.937 回答
0

信不信由你,这很正常。它实际上与您的代码没有任何关系,但或多或​​少与您使用autosave. 这种自动保存行为实际上是默认打开/启用的(您也可以将其关闭 - 但我强烈建议您不要这样做,除非您需要并且知道您在做什么,呵呵)。

无论如何,UIManagedDocument实际上默认情况下会自动将您的数据保存到文档存储中,并且在后台同样如此 - 但需要注意的是,它会尽可能地执行此操作(或者更好,只要它愿意)。意识到它会在后台为您执行此操作,这样您就不必担心它(我非常喜欢它的一个功能 - 但也可能让他感到痛苦)。

听起来您需要保存它,因为它没有显示您的数据,或者您没有看到预期的结果。

如果是这种情况,那么我认为您应该更多地研究如何让它实际保存您的更改,以便它可以显示在您的控制器中。实际上,它实际上与 UIManagedDocument 何时保存几乎没有关系,更多的是与您的上下文何时更新有关。如果确实如此,您可能会发现我对同一主题的不同线程/问题的回答很有帮助: Multiple UIManagedDocument For Read & Write

这可能是也可能不是你所追求的,但我相信它至少会让你走上正确的道路。

于 2014-07-21T04:23:57.237 回答