2

在使用 Core Data 时,我发现我的UIManagedDocument对象的 adocumentState等于 5。UIDocument文档只定义了这些常量:

enum {     UIDocumentStateNormal          = 0,
   UIDocumentStateClosed          = 1 << 0,
   UIDocumentStateInConflict      = 1 << 1,
   UIDocumentStateSavingError     = 1 << 2,
   UIDocumentStateEditingDisabled = 1 << 3   }; typedef NSInteger UIDocumentState;

这将是 0、1、2、4 和 8。5 可能是使用的特殊状态UIManagedDocument,但我在任何地方都找不到它的记录。当核心数据模式发生变化时,状态似乎发生了。我不知道国家是什么意思。我通常会收到错误:Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.',这是有道理的,因为文档需要以正常状态打开才能用作持久存储。

现在我只是检查状态是否等于 5 并删除持久存储并在发生这种情况时重新创建它。但是一旦我的应用程序上线并存储用户数据,我就不想这样做了。managedDocument.documentState == 5我还没有研究过迁移核心数据模式的最佳实践,但在我的代码中进行检查似乎也有点混乱。在任何地方都没有关于此文档状态的任何文档吗?

更新:现在我正在查看它,这是有道理的,这些常量被定义为它们的方式的原因是它们可以按位或一起作为掩码。因此,documentState等于 5 意味着它既是UIDocumentStateClosed也是UIDocumentStateSavingError。不过,这些错误非常普遍。我将如何缩小根本原因?

此外,我看到的所有用于检查这些文档状态的示例代码都显示检查是否相等, ie if (managedDocument.documentState == UIDocumentStateClosed),但这意味着这是不正确的,应该使用按位与检查,即 ie if (managedDocument.documentState & UIDocumentStateClosed)

4

1 回答 1

2

我对 UIDocument 没有太多经验,但在我看来,文档状态是一个位掩码,是几个状态的组合,所以这documentState == 5 == 1 + 4意味着UIDocumentStateClosed + UIDocumentStateSavingError.

iOS 的基于文档的应用程序编程指南中,您会看到documentState从未检查过==,但总是针对位掩码进行测试,例如:

-(void)documentStateChanged {
    UIDocumentState state = _document.documentState;
    [_statusView setDocumentState:state];
    if (state & UIDocumentStateEditingDisabled) {
        [_textView resignFirstResponder];
    }
    if (state & UIDocumentStateInConflict) {
        [self showConflictButton];
    }
    else {
        [self hideConflictButton];
        [self dismissModalViewControllerAnimated:YES];
    }
}
于 2013-04-26T07:06:17.580 回答