Я использую реализацию Джастина Дрисколла в Core Данные с одним общим UIManagedDocument. В моем приложении для iphone все было хорошо, пока я не перенес его на раскадровку iPad и контроллер с разделенным экраном для приложения ipad. Проблема в том, что openwithCompletionHandler вызывается дважды, один раз из моего основного представления в viewDidLoad и снова в моем подробном представлении viewWillLoad. Вызовы выполняются в быстрой последовательности, и, поскольку документ все еще находится в UIDocumentStateClosed, когда выполняется второй вызов моего метода executeWithDocument (ниже) синглтона, приложение аварийно завершает работу. Я посмотрел ответ e_x_p на сообщение iOS5.1: синхронизация задач ( дождитесь завершения), но @sychronized в этом случае не сработает, так как в том же потоке вызывается PerformWithDocument ниже. Как мне защититься от нескольких вызовов openwithCompletionHandler? Единственный способ защититься от этого — приостановить выполнение одного из вышеперечисленных вызовов, пока я не буду уверен, что UIDocumentStateNormal имеет значение true, а затем отпустить. Это, однако, заморозило бы основной поток пользовательского интерфейса, что не очень хорошо. Что, однако, было бы лучшим способом сделать это, не замораживая пользовательский интерфейс?
Из кода UIManagedDocumentSingleton:
- (void)performWithDocument:(OnDocumentReady)onDocumentReady
{
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL success)
{
onDocumentReady(self.document);
};
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]])
{
//This should never happen*******************
[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);
}
}