在以下代码中,没有任何完成处理程序被执行。我能找到的一个解释是Bug in iPhone Simulator 5.1 with Xcode 4.5 using 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'
}
编辑:我发现了一个似乎正在处理完全相同问题的问题。 I Can't get an 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];
}
}