我面临一个奇怪的问题。我有一个方法,用一些数据(fetchData)填充一个数组(实际上非常多,而且有点慢)。我正在使用该数组来构建表的行。
我尝试在我的代码中的许多地方调用fetchData,在视图构造的不同时间,我似乎总是得到以下内容:显示黑色屏幕,直到数组中的数据加载。我从下面调用了fetchData:
由于我使用导航视图控制器,让应用程序看起来挂起是非常糟糕的,因为它卡在黑屏上。我希望我的代码能实现的是显示一个空表,带有进度指示器,直到数据加载 - 然后刷新。不幸的是,我没有这么做,因为无论我在哪里调用fetchData都没有加载视图。
帮助表示赞赏!
P.S。为了解决这个问题,我甚至尝试使用TTTableViewController,但从不显示加载视图。典型。 叹息
答案 0 :(得分:2)
您的加载方法必须阻止UI。您应该将其移动到另一个线程并让数据加载到那里。您可以在viewDidLoad
。
这是您需要(使用GCD)的骨架代码
dispatch_queue_t downloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(downloadQueue, ^{
... Move all the loading part here.
dispatch_async(dispatch_get_main_queue(),^{
... Do all the UI updates, mostly, [tableView reloadData];
})
})
答案 1 :(得分:1)
您可以添加一个计时器,以便在viewDidAppear
方法的某处延迟调用。例如:
- (void)viewDidAppear:(BOOL)animated {
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fetchData) userInfo:nil repeats:NO];
}
这将使您的应用程序有时间加载UI并启动加载屏幕,然后开始提取数据。如果您希望使用该路径,也可以尝试在后台线程中获取数据
答案 2 :(得分:0)
我遇到了同样的问题,表格视图最初没有加载,但它在另一个.m文件中工作了。这是有效的:
将此添加到viewDidLoad:
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
这是执行块:
#pragma mark -
#pragma mark Fetched results controller
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController == nil) {
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"OMFrackinG" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
//分组和排序可选
//NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"country" ascending:YES];
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES];// was name
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
propriate.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"state" cacheName:nil];//@"state"
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor1 release];
[sortDescriptor2 release];
[sortDescriptors release];
}
return fetchedResultsController;
}