我在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
此外,代码在设备上运行良好,不会产生“令人惊讶”的消息,并且运行之后发布的所有代码就好了。
我没有在Google上找到任何内容,也没有在Apple Developer页面上找到任何内容。重新启动模拟器或XCode,或重新安装它们都不会改变行为。
有什么想法吗?
答案 0 :(得分:1)
我只能说我曾经多次发生这种情况。对我来说,在我更新dataModel后我很懒,到目前为止,每次我收到此错误都是因为我改变了我的数据模型。通常,我需要做的就是从模拟器中删除我的应用程序并重新运行它,它总是很好。希望这可以帮助那些人。
答案 1 :(得分:1)
我想我找到了答案。看起来UIManagedDocument的自动保存仅在模拟器上几秒后启动。
因此,我通过按主页按钮最小化模拟器上的应用程序,然后单击图标以再次最大化它。然后我在模拟器中终止了应用程序。
当我重新启动应用程序时,数据库已加载。错误仍然显示 - 它是因为文档处于“关闭”状态(这是正常的 - 这就是CS193P要求调用openWithCompletionHandler的原因),但是我保留了启动时的数据。不幸的是,我必须在终止应用程序之前执行最小化/最大化例程,否则在下次启动时将丢弃更改。
您能否验证这是您能够重新创建的行为?至少出于测试目的,这应该是一个足够好的技巧。
答案 2 :(得分:0)
尝试升级到最新的iOS 5.1。我不认为UIManagedDocument与iCloud在5.0中可靠地工作。这是我的经历。
答案 3 :(得分: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]
}
}];
}
答案 4 :(得分:0)
当文档文件url的最后一个路径组件是@“Database”时仍然有错误。添加扩展名@“Database.db”似乎已修复它,现在一切正常。虽然也升级到了Lion。
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Database.db"];