В следующем коде ни один из обработчиков завершения никогда не выполняется. Единственное объяснение, которое мне удалось найти, это Ошибка в iPhone Simulator 5.1 с Xcode 4.5 с использованием UIManagedDocument . В нем говорится, что это может быть ошибка в симуляторе iPhone 5.1. Однако я пробовал симуляторы iPhone 6.0, 6.1 и 7.0, ни один из них не работал. Я буду очень признателен за вашу помощь.
(Кстати, я видел этот код в Стэнфордском курсе iOS, лекция 14)
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"DataDocument"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];
if(![[NSFileManager defaultManager] fileExistsAtPath:[url path]]){
NSLog(@"This logs");
[document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){
NSLog(@"This never logs");
}];
}else if(document.documentState == UIDocumentStateClosed){
NSLog(@"This logs");
[document openWithCompletionHandler:^(BOOL success){
NSLog(@"This never logs");
}];
}else{
//I have a separate log for this, but it's never 'else'
}
РЕДАКТИРОВАТЬ: я нашел вопрос, который, кажется, имеет дело с точно такой же проблемой. Я не могу получить nsmanageobjectcontext. Я просто прикрепил его к обработчик завершения не выполняется.
РЕДАКТИРОВАТЬ: я узнал, в чем проблема: поскольку openWithCompletionHandler выполняется асинхронно, мое приложение попытается использовать документ до того, как он завершит открытие. Использование цикла выполнения решило проблему. Пример ниже.
if(doc.documentState == UIDocumentStateClosed){
NSLog(@"This logs");
__block BOOL waitingOnCompletionHandler = YES;
[doc openWithCompletionHandler:^(BOOL success){
NSLog(@"This logs too!");
}];
while (waitingOnCompletionHandler) {
NSDate *futureTime = [NSDate dateWithTimeIntervalSinceNow:0.1];
[[NSRunLoop currentRunLoop] runUntilDate:futureTime];
}
}
document
равно нулю, запишите, равно оно или нет. - person zaph   schedule 24.11.2013