1

我在 iOS 5.0 中使用 UIManagedDocument,在模拟器上运行应用程序,在 OSX 10.6 下使用 XCode 4.2。有问题的代码如下所示:

if (![[NSFileManager defaultManager] fileExistsAtPath:[self.photoDatabase.fileURL path]]) {
    // does not exist on disk, so create it
    [self.photoDatabase saveToURL:self.photoDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        [self setupFetchedResultsController];
        [self fetchFlickrDataIntoDocument:self.photoDatabase];

    }];
} else if (self.photoDatabase.documentState == UIDocumentStateClosed) {
    // exists on disk, but we need to open it
    // *** the following line generates the message ***
    [self.photoDatabase openWithCompletionHandler:^(BOOL success) {
        //[self setupFetchedResultsController];
        }];
} else if (self.photoDatabase.documentState == UIDocumentStateNormal) {
    // already open and ready to use
    [self setupFetchedResultsController];
}

运行标记的行会在日志中创建以下消息:

2012-01-10 22:33:17.109 Photomania[5149:4803] NSFileCoordinator: A surprising server error was signaled. Details: Connection invalid

发送消息后,UIManagedDocument 可能工作也可能不工作——我还没有找到决定这一点的情况。

我很确定代码是正确的,因为它实际上是斯坦福 CS193p 课程中的代码示例之一。整个示例可以在他们的网站上下载 http://www.stanford.edu/class/cs193p/cgi-bin/drupal/ 直接链接到代码: http: //www.stanford.edu/class/cs193p/ cgi-bin/drupal/system/files/sample_code/Photomania_0.zip

此外,代码在设备本身上运行良好,不会产生“令人惊讶”的消息,并且运行之后的所有代码都很好。

我在谷歌上没有找到任何东西,在 Apple 开发者页面上也没有。重新启动模拟器或 XCode,或重新安装它们都不会改变行为。

有任何想法吗?

4

5 回答 5

1

我想我已经找到了答案。看起来 UIManagedDocument 的自动保存仅在模拟器上几秒钟后才会启动。

所以我在模拟器上最小化了应用程序,按下主页按钮,然后单击图标再次最大化它。然后我在模拟器中终止了该应用程序。

当我重新启动该应用程序时,数据库已加载。错误仍然出现 - 因为文档处于“关闭”状态(这是正常的 - 这就是 CS193P 要求调用 openWithCompletionHandler 的原因),但我在启动过程中的数据被保留了。不幸的是,我必须在终止应用程序之前执行最小化/最大化例程,否则更改将在下次启动时被丢弃。

您能否验证这是您能够重新创建的行为?至少出于测试目的,这应该是一个足够好的技巧。

于 2012-03-06T21:54:14.380 回答
1

我只能说这种情况发生在我身上好几次了。对我来说,更新数据模型后我很懒惰,到目前为止,每次我收到这个错误都是因为我改变了我的数据模型。通常,我需要做的就是从模拟器中删除我的应用程序并重新运行它,结果总是很好。希望这可以帮助那里的人。

于 2012-03-01T18:19:31.297 回答
0

喜欢斯坦福的 iTunes 课程。但是,我认为使用 UIManagedDocument 的示例代码是错误的。事实上,他在演示中指出,他这样做只是因为他想立即获取信息。在代码注释中,他说不要使用自动保存功能,因为如果应用退出,数据将不会被保存。但是,UIManagedDocument在退出之前保存任何必要的内容。它具有用于退出/多任务处理/等的所有相关处理程序,以确保保存数据。

因此,如果您使用该代码作为示例,那么这是一个应该可以工作的版本,并且不使用 saveToURL(我没有 flickr 帐户,所以我实际上并没有运行它 - 但这就是类的方式设计工作)。如果它不起作用,请告诉我。

- (void)fetchFlickrDataIntoDocument:(UIManagedDocument *)document
{
    NSManagedObjectContext *ctx = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType];
    ctx.parentContext = document.managedObjectContext;
    [ctx performBlock:^{
        NSArray *photos = [FlickrFetcher recentGeoreferencedPhotos];
        for (NSDictionary *flickrInfo in photos) {
            [Photo photoWithFlickrInfo:flickrInfo inManagedObjectContext:ctx];
            // Push changes to document MOC
            [ctx save:0]; // propagates changes to parent MOC
            // and tell the document it is dirty and needs to be saved
            // It will be saved when the document decides its time to save
            // but it *will* be saved.
            [document updateChangeCount:UIDocumentChangeDone]
        }
    }];
}
于 2012-04-17T23:31:33.477 回答
0

当文档文件 url 的最后一个路径组件是 @"Database" 时仍然有错误。添加扩展 @"Database.db" 似乎已经修复它,现在一切运行良好。不过也升级到了Lion。

NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Database.db"];  
于 2012-05-10T15:32:44.107 回答
0

尝试升级到最新的 iOS 5.1。我不认为带有 iCloud 的 UIManagedDocument 在 5.0 中工作可靠。这是我的经验。

于 2012-02-19T06:42:12.267 回答