Core data 使用saveToURL创建UIManagedDocument时的iOS CoreDataTableViewController表
我正在使用斯坦福大学的CoreDataTableViewController来显示一个动态表 应用程序的工作方式:要向该表添加一行,将弹出一个子屏幕进行数据输入,当子屏幕关闭时,将插入新创建的managedObject,并通过回调重新加载该表 我注意到,重新进入屏幕时,新添加的行会间歇性地从表中丢失。我注意到,只有在首次使用saveToURL创建UIManagedDocument对象时,才会出现这种行为。随后,重新启动应用程序并使用openWithCompletionHandler打开UIManagedDocument后,列表始终正确显示 以下是我用来创建/打开UIManagedDocument的代码:Core data 使用saveToURL创建UIManagedDocument时的iOS CoreDataTableViewController表,core-data,uimanageddocument,Core Data,Uimanageddocument,我正在使用斯坦福大学的CoreDataTableViewController来显示一个动态表 应用程序的工作方式:要向该表添加一行,将弹出一个子屏幕进行数据输入,当子屏幕关闭时,将插入新创建的managedObject,并通过回调重新加载该表 我注意到,重新进入屏幕时,新添加的行会间歇性地从表中丢失。我注意到,只有在首次使用saveToURL创建UIManagedDocument对象时,才会出现这种行为。随后,重新启动应用程序并使用openWithCompletionHandler打开UIMan
- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
{
NSLog(@"Called OnDocumentDidLoad");
onDocumentReady(self.document);
};
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
{
[self.document saveToURL:self.document.fileURL
forSaveOperation:UIDocumentSaveForCreating
completionHandler:OnDocumentDidLoad];
}
else if (self.document.documentState == UIDocumentStateClosed)
{
NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad");
[self.document openWithCompletionHandler:OnDocumentDidLoad];
}
else if (self.document.documentState == UIDocumentStateNormal)
{
OnDocumentDidLoad(YES);
}
}
运行上述代码时,始终调用onDocumentDidLoad(),并且成功标志为YES
任何帮助都将不胜感激。提前谢谢
--编辑以下代码以显示我创建、关闭和重新打开文档以响应Jody的方法-我仍然遇到相同的问题---
您没有指明您使用的是哪个版本的iOS,这几乎总是很重要的 创建文档时出现iOS 5问题。很久以前,我在创建
UIManagedDocument
时采用了以下方法。它仍然在我的库代码中,因为我从来没有足够的动力去花时间看看问题是否得到了解决
如果文档不存在,请将其保存以进行创建,然后在完成处理程序中关闭文档,然后在该完成处理程序中打开文档。这样,除非文档已经存在,否则我从未真正使用过它。谢谢您的回复。我在iOS 6上。是的,我还试着在完成处理程序中关闭它并重新打开它,但是它没有什么区别——空白行仍然出现。我已经添加了代码,包括我的努力来重新打开新创建的文档。看起来对吗?不幸的是,空白行仍然间断地出现。和以前一样,在终止应用程序后重新启动它可以解决问题,但显然这是不可接受的。在我看来,将块定义为变量会失去参考价值的局部性。无论如何,这看起来有点合理。您确定在尝试填充文档之前正在等待异步回调到达吗?就我个人而言,在文档实际打开并准备就绪之前,我不会设置文档属性。。。这可以防止过早使用。嗨,乔迪,再次感谢你的回复。据我所知,我看不出代码中的逻辑有任何缺陷——所有的事情都是在onDocumentReady中完成的。您是否可以发布代码片段来说明您是如何做到这一点的?我对这件事感到茫然。再次感谢。我认为您的问题在别处,而不是文档的打开方式。
- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
{
NSLog(@"Called OnDocumentDidLoad success: %d", success);
onDocumentReady(self.document);
};
void (^OnDocumentDidClose)(BOOL) = ^(BOOL success)
{
NSLog(@"Called OnDocumentDidClose, openWithCompletionHandler success: %d", success);
[self.document openWithCompletionHandler:OnDocumentDidLoad];
};
void (^OnDocumentDidSave)(BOOL) = ^(BOOL success)
{
NSLog(@"Called OnDocumentDidSave success: %d", success);
if (self.document.documentState == UIDocumentStateClosed)
{
NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad from onDocumentDidSave - was closed");
[self.document openWithCompletionHandler:OnDocumentDidLoad];
}
else if (self.document.documentState == UIDocumentStateNormal)
{
// TODO Close and reopen?
NSLog(@"Calling closeWithCompletionHandler:OnDocumentDidClose from onDocumentDidSave - was normal");
[self.document closeWithCompletionHandler:OnDocumentDidClose];
}
};
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
{
// Database doesn't exist, create it, then close and reopen in completion handler
[self.document saveToURL:self.document.fileURL
forSaveOperation:UIDocumentSaveForCreating
completionHandler:OnDocumentDidSave];
}
else if (self.document.documentState == UIDocumentStateClosed)
{
// Open existing database
NSLog(@"Calling openWithCompletionHandler:OnDocumentDidLoad");
[self.document openWithCompletionHandler:OnDocumentDidLoad];
}
else if (self.document.documentState == UIDocumentStateNormal)
{
// Already opened
OnDocumentDidLoad(YES);
}
}