2013-04-10 3 views
4

Я использую этот блог: http://www.adevelopingstory.com/blog/2012/03/core-data-with-a-single-shared-uimanageddocument.html, чтобы создать синглтон для одноразового использования UIManagedDocument. Вот соответствующий код в BetterDatabaseКогда закрываются документы UIManagedDocuments?

//In BetterDatabase 

typedef void (^OnDocumentReady) (UIManagedDocument *document); 

- (void)performWithDocument:(OnDocumentReady)onDocumentReady 
{ 
    void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success) { 
     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) { 
     [self.document openWithCompletionHandler:OnDocumentDidLoad]; 
    } else if (self.document.documentState == UIDocumentStateNormal) { 
     OnDocumentDidLoad(YES); 
    } 
} 

//In other class 
[[BetterDatabase sharedDocumentHandler] performWithDocument:^(UIManagedDocument * document) { 
     //Do stuff 1 
     //Do stuff 2 
}]; 

Мой вопрос: Когда допускается UIManagedDocument закрывается автоматически? А именно, возможно ли, чтобы документ был закрыт (OS/SDK) между строками 1 и 2? Что делать, если пользователь минимизирует приложение для iPhone, а затем снова открывает его? Будет ли закрыт UIManagedDocument?

Другой способ выразить это: Будет ли когда-либо закрываться UIManagedDocument, пока у меня есть сильный указатель на него?

ответ

4

к вашему первому вопросу, когда можно автоматически закрыть UIManagedDocument? есть простой ответ: «Когда iOS сочтет нужным». Другими словами, у вас нет контроля, когда это может произойти (если вы не закрываете его самостоятельно, но это не главное). Но вы все равно можете ответить на эту ситуацию.

В частности, в файле AppDelegate, вы можете включить строку, чтобы сохранить документ в

- (void)applicationWillResignActive:(UIApplication *)application 

(не обязательно, если вы используете UIManagedDoc)

Теперь, ваше приложение должно также контролировать UIManagedDocument изменяет, как объяснено в документе here, строка «Добавление наблюдателя от уведомления UIDocumentStateChangedNotification»

На ваш второй вопрос ответ ДА. Пример: если у вас длинная фоновая операция и пользователь выключил свой телефон, документ будет закрыт. Поскольку вы работаете с UIManagedDocument, сохранение выполняется автоматически, поэтому вам не стоит беспокоиться о том, чтобы он был в непоследовательном состоянии.

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

к вашему третьему вопросу, восстанавливающемуся из предыдущего состояния, это действительно зависит от приложения. Apple выпустила много документации, here. Это необходимо использовать в сочетании с надлежащим ответом на изменение состояния UIManagedDocument, включая конфликты.

К вашему последнему вопросу ответит NO нормальный условиях, а ДА - в противном случае - низкая память, закрытие телефона - даже если ваше приложение находится на переднем плане.

Таким образом, вы не можете контролировать, когда приложение прекращается (батарея разряжается, ОС выключается?), Но вы по-прежнему можете реагировать на изменения UIManagedDocument или изменения жизненного цикла приложения таким образом, чтобы вы должны сохранить целостность данных.

EDIT: Спасибо, не подумал, что он полностью ответил на ваш вопрос. На всякий случай, сообщение, на которое вы ссылаетесь в своем первоначальном вопросе, очень хорошо справляется с тем, чтобы выложить важный суф. в частности, я принял это почти дословно, а также добавил свои собственные уведомления, чтобы рассказать о том, когда и как они должны обновляться. Не всегда приятно полагаться на механизмы Apple DataSource, поскольку иногда это может привести к условиям гонки, которые очень трудно устранить (если вы обновите представление, если оно не видно, например ..).

Таким образом, в этих двух методов

- (void)objectsDidChange:(NSNotification *)notification 
{ 
#ifdef DEBUG 
    NSLog(@"NSManagedObjects did change."); 
#endif 
} 

- (void)contextDidSave:(NSNotification *)notification 
{ 
#ifdef DEBUG 
    NSLog(@"NSManagedContext did save."); 
#endif 
} 

информационное поле пользователя в уведомлении сообщает вам, что это было сделано в документ, например:

userInfo = { 
    inserted = "{<the Core data fields inserted>}"; 
    updated = "{<code data fields updated>}"; 
}} 

, а затем обновить взгляды я считаю нужным , Например, если вы получаете новые данные с удаленного сервера, вы можете подсчитать количество новых вставленных полей и обновить количество значков. Или отправьте уведомление, чтобы обновлять только один вид и т. Д.

Согласование данных по представлениям с UIManagedDoc непросто, но как обновлять данные без генерации побочных эффектов оказалось очень сложным.

удачи!

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