我在Core Data上使用Justin Driscoll's article,使用单例模式的UIManagedDocument为UITabViewController设置它。我在模拟器上运行应用程序。它第一次正常工作。数据库创建成功,我可以在tableview控制器中查看每个选项卡的数据。但是当我重新启动我的应用程序时,tableviews是空的,因为NSFetchRequest为实体提取0匹配。第一次运行期间,相同的提取请求会获取正确的结果。
我认为在我在模拟器中停止应用程序之前,它与加载数据和数据的异步性质有关。因此,在第二轮应用程序中无法获得数据。
我在代码中看到的数据加载方式。 fetchDataIntoDocument方法执行初始加载数据。
// Document Handler Singleton Class
-(void) performWithDocument:(OnDocumentReady)onDocumentReady {
void (^OnDocumentDidLoad)(BOOL) = ^(BOOL Success) {
onDocumentReady(self.document);
};
if (![[NSFileManager defaultManager] fileExistsAtPath:[self.document.fileURL path]]) {
**[self fetchDataIntoDocument:self.document];**
[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);
}
}
-(void)fetchDataIntoDocument:(UIManagedDocument *)document {
MyEntityDataController *dc= [[MyEntityDataController alloc] init];
NSDictionary *entityInfo =[dc getEntityInfo];
[document.managedObjectContext performBlock:^{
[Entity createEntityWithInfo:entityInfo inManagedObjectContext:document.managedObjectContext];
}];
}
我的TableViewController类
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (!self.databaseDocument) {
[[LTDatabaseDocumentHandler sharedDatabaseDocumentHandler] performWithDocument:^ (UIManagedDocument *document) {
self.databaseDocument = document;
[self populateTableViewArrayFromDocument:self.databaseDocument];
}];
}
}
在populateTableViewArrayFromDocument中,我正在执行我的获取请求
-(void)populateTableViewArrayFromDocument:(UIManagedDocument *)document
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity2"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSArray *matches = [self.databaseDocument.managedObjectContext executeFetchRequest:request error:&error];
NSLog(@" matches count for Entity2 %d", matches.count);
for (Entity2 *entity2 in matches) {
//do stuff with data and add it to tableview array
}
}
答案 0 :(得分:1)
我想我已经找到了你为什么遇到这个问题。我刚刚遇到这个问题,需要进行一些研究才能弄明白。基本上,你是对的。问题确实存在于UIManagedDocument的异步特性中。您需要等到文档加载到内存中然后进行提取。
这是我用来确保文档准备就绪的代码:
if ([[NSFileManager defaultManager] fileExistsAtPath:[_URLDocument path]]) {
[_managedDocument openWithCompletionHandler:^(BOOL success){
[self ready]
if (!success) {
// Handle the error.
}
}];
}
希望这有帮助,欢呼!