0

我有一个使用 Core Data 的应用程序,它通过使用 UIManagedObject 获取它的 ManagedObjectContext。从阅读中,我看到我不应该直接保存上下文 - 而我应该依赖 UIManagedObject 的自动保存或使用 saveToURL:... 我的问题是我想验证存储在我的实体中的数据。我对实体有约束,指定字符串属性的最小长度为 1。但是,我可以创建一个新对象,为其属性分配空字符串,然后保存文件。在 saveToURL:... 的完成处理程序中,它始终具有真正的成功值。然后,我为我的实体的 name 属性创建了自己的验证器。我使用了 Core Data Programming Guide 中的示例代码 -

-(BOOL)validateName:(id *)ioValue error:(__autoreleasing NSError **)outError 

{
    if (*ioValue == nil) 

    {
        if (outError != NULL) 

        {
            NSString *errorStr = @"nil error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        }

        return NO;

    }

    else if( [*ioValue length] == 0 )

    {

        if (outError != NULL) {

            NSString *errorStr = @"length error";

            NSDictionary *userInfoDict = [NSDictionary dictionaryWithObject:errorStr

                forKey:NSLocalizedDescriptionKey];

            NSError __autoreleasing *error = [[NSError alloc] initWithDomain:@"domain"

                code:1

                userInfo:userInfoDict];

            *outError = error;

        }

        return NO;

    }

    else

    {

        return YES;

    }

}

当它运行时,我看到 ioValue 的长度为 0 并且它返回 NO,但是我的完成处理程序永远不会被调用。任何帮助都会很棒。

关于如何使用 UIManagedDocument 处理保存错误,我是否缺少一些东西 - 特别是如何通知调用代码在保存其信息时发生了错误。

4

2 回答 2

0

通常,您应该只调用 saveToURL 来创建一个全新的文件。让自动保存完成其余的工作。

另外,我不确定我是否遵循您的问题。如果您询问如何知道保存失败,您可以做的最好的事情是注册通知(因为所有保存都发生在后台线程上)。

直接来自文档:

UIDocument 对象在其生命周期的任何时刻都有特定的状态。您可以通过查询 documentState 属性来检查当前状态。并且您可以通过观察 UIDocumentStateChangedNotification 通知来通知文档状态的变化。

于 2012-04-17T23:52:24.560 回答
0

我想我需要handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted在 UIManagedDocument 的子类中实现。我发现通过这篇文章 - http://blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

于 2012-11-13T19:15:28.083 回答