我正在使用Justin Driscoll在Core Data上使用单个共享UIManagedDocument实现.我的iphone应用程序中的一切都很好,直到我将它移动到iPad故事板和ipad应用程序的splitview控制器.问题是openwithCompletionHandler被调用两次,一次来自viewDidLoad中的主视图,另一次是我的详细视图viewWillLoad.这些调用是快速连续的,因为当对单例的performWithDocument方法(下面)进行第二次调用时,文档仍然在UIDocumentStateClosed中,应用程序崩溃.我查看了e_x_p对iOS5.1后的回答:同步任务(等待完成)但@sychronized在这种情况下不起作用,因为下面的performWithDocument是在同一个线程上调用的.我如何防止多次调用openwithCompletionHandler?我能想到防止这种情况的唯一方法是暂停执行上面的一个调用,直到我确定UIDocumentStateNormal为true然后释放.这虽然会冻结主要的UI线程,这是不好的.尽管如此,如果没有冻结用户界面,最好的办法是什么呢?
从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);
}
}
Run Code Online (Sandbox Code Playgroud)