Core data 使用saveToURL创建UIManagedDocument时的iOS CoreDataTableViewController表

Core data 使用saveToURL创建UIManagedDocument时的iOS CoreDataTableViewController表,core-data,uimanageddocument,Core Data,Uimanageddocument,我正在使用斯坦福大学的CoreDataTableViewController来显示一个动态表 应用程序的工作方式:要向该表添加一行,将弹出一个子屏幕进行数据输入,当子屏幕关闭时,将插入新创建的managedObject,并通过回调重新加载该表 我注意到,重新进入屏幕时,新添加的行会间歇性地从表中丢失。我注意到,只有在首次使用saveToURL创建UIManagedDocument对象时,才会出现这种行为。随后,重新启动应用程序并使用openWithCompletionHandler打开UIMan

我正在使用斯坦福大学的CoreDataTableViewController来显示一个动态表

应用程序的工作方式:要向该表添加一行,将弹出一个子屏幕进行数据输入,当子屏幕关闭时,将插入新创建的managedObject,并通过回调重新加载该表

我注意到,重新进入屏幕时,新添加的行会间歇性地从表中丢失。我注意到,只有在首次使用saveToURL创建UIManagedDocument对象时,才会出现这种行为。随后,重新启动应用程序并使用openWithCompletionHandler打开UIManagedDocument后,列表始终正确显示

以下是我用来创建/打开UIManagedDocument的代码:

- (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);
    }
}