Как интерпретировать document.state == 12 (iCloud)

#iphone #objective-c #ios5 #icloud #uidocument

#iPhone #objective-c #ios5 #icloud #uidocument

Вопрос:

Всякий раз, когда я загружаю UIDocument из iCloud, я проверяю его состояние следующим образом:

 NSLog(@"Library loadFromContents: state = %d", self.documentState);
  

В некоторых случаях я получал documentState 8 или 12, которые вызывали сбои. Теперь мне интересно, что именно обозначают 8 и 12. Насколько мне известно, documentState — это битовое поле, поэтому у него много разных флагов. Документы показывают, что:

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

Однако я понятия не имею, как интерпретировать это в моей ситуации. Как мне узнать, что означают 8 и 12?

Ответ №1:

Внутри перечисления они выполняют некоторый сдвиг битов. Они могли бы также написать это так:

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

Небольшой сдвиг влево в основном равен 2 в степени любого числа, заданного после оператора shift … 1<<1 означает 2 ^ 1, 1<<2 означает 2 ^ 2 и т.д…

Состояние 8 означает UIDocumentStateEditingDisabled , а 12 означает UIDocumentStateEditingDisabled и UIDocumentStateSavingError

Комментарии:

1. Большое спасибо за это очень ясное объяснение!

Ответ №2:

Предлагаемый способ справиться с этими уведомлениями — не проверять наличие if(state == UIDocumentStateInConflict) , а логически И примерно так:

 if (state amp; UIDocumentStateInConflict) {
    // do something...
}
  

смотрите «Пример: разрешение пользователю выбирать версию» в «Руководстве по программированию приложений на основе документов» из официальных документов