以下代码是我的tableViewController的获取数据(第一次填充数据)。我正在使用NSManagedDocument的managedObjectContext来填充(预填充)我的数据库。源代码是我从TXT文件中清理的数组,该文件直接位于Xcode的resources文件夹中。在创建之后,我有文件案例,如关闭/打开和正常。
以下代码使用获取的结果控制器请求正确地输入并将数据提取到表中。但是,当数据加载到线程中时,该文件旨在将UI从这一次数据创建(26854对象名称)释放到managedObject.name属性繁重操作中,tableview和我的UI被冻结(持续1-15秒)我认为第一次为我的数据库填充document.managedObjectContext时。
10-15秒后加载数据并正确显示。但是,当我停止模拟器并在模拟器中重新启动应用程序时,虽然我保存文档,如下面的代码所示,并且我使用相同的获取结果控制器设置(和请求)表视图显示为空,在这种情况下它是可移动的(文档状态在这个阶段显示开放和正常,文件路径是相同的,我检查了......似乎既不是自动保存也不是显式saveForOverwriting我使用工作......或者是其他的东西?我尝试了很多东西而且我我很快就会发疯。我认为这与我的多线程有关。
self.managedObjectNames是表视图中的数组属性,我在表视图的loadView期间从TXT文件设置它:
有没有人可以在这里显示错误?是否在实体创建类别的方法中给出self.managedObjectNames。
谢谢!
- (void)fetchDataIntoDocument:(UIManagedDocument *)document {
dispatch_queue_t fetchQ = dispatch_queue_create("Data fetcher", NULL);
dispatch_async(fetchQ, ^{
[document.managedObjectContext performBlock:^{
for (int i = 0; i < 26854; i++) {
[managedObject managedObjectWithId:[NSNumber numberWithInt:i] andArray:self.managedObjectNames inManagedObjectContext:document.managedObjectContext];
}
// NSLog(@"Save baby!!?");
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
}];
});
dispatch_release(fetchQ);
}
答案 0 :(得分:0)
您的UI被阻止10-15秒的原因是因为document.managedObjectContext是使用NSMainQueueConcurrencyType创建的。这意味着performBlock:方法将在主队列上执行。
在代码中创建fetchQ没有任何理由。如果获取数据需要花费相当长的时间,但是添加它们会很快(例如创建/修改少数对象),这是有原因的:
dispatch_async(fetchQ, ^{
// fetch data here (e.g. fetchAttribute may take few seconds)
NSString *attribute = fetchAttribute();
[document.managedObjectContext performBlock:^{
MyObject *o;
o = [NSEntityDescription insertNewObjectForEntityForName:@"MyObject"
inManagedObjectContext:document.managedObjectContext];
o.myAttribute = attribute;
}];
});
但是我不知道你的主要问题的答案。