2013-04-26 4 views
2

При работе с Core Data, я обнаружил, что мой UIManagedDocument объект имеет documentState равным 5. UIDocument documentation только определяет эти константы:UIManagedDocument documentState == 5, неопределенное состояние постоянной

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 и удаляет постоянное хранилище и воссоздает его, когда это происходит. Но как только мое приложение будет жить и хранит пользовательские данные, я не хочу этого делать. Я не изучал лучшие практики переноса схем Core Data, но, похоже, это тоже беспорядочно, чтобы проверить код managedDocument.documentState == 5 в моем коде. Нет ли какой-либо документации по этому документу в любом месте?

Обновление: Теперь, когда я смотрю на это, было бы разумно, что причина, по которой эти константы определены так, как они есть, заключается в том, что они могут быть побитовыми вместе как маски. Таким образом, documentState, равный 5, будет означать, что он равен UIDocumentStateClosed, а также UIDocumentStateSavingError. Однако эти ошибки довольно общие. Как я могу сузить основную причину?

Кроме того, весь пример код я видел для проверки этих состояний документов показывают проверки равенства, то есть if (managedDocument.documentState == UIDocumentStateClosed), но это будет означать, что это не правильно, и скорее следует проверить с помощью побитового и, т.е. if (managedDocument.documentState & UIDocumentStateClosed).

ответ

2

У меня нет большого опыта работы с UIDocument, но мне кажется, что государственный документ является битой маски что является сочетанием нескольких состояний, так что documentState == 5 == 1 + 4 означает UIDocumentStateClosed + UIDocumentStateSavingError.

В Document-Based App Programming Guide for 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]; 
    } 
} 
+0

Я пришел к такому выводу, как вы отвечали. Есть ли у вас какая-либо помощь относительно того, как найти источник состояния ошибки сбережения? Как я уже сказал, я предполагаю, что это связано с изменением схемы, но как бы я это убедился? –

+0

@JeffLockhart: Я только пытался ответить на первую версию вашего вопроса. К сожалению, я не могу помочь вам со второй версией. –

 Смежные вопросы

  • Нет связанных вопросов^_^