TableViewController的表视图在加载数据之前不显示

时间:2011-05-25 22:33:56

标签: iphone cocoa-touch xcode uitableview

我面临一个奇怪的问题。我有一个方法,用一些数据(fetchData)填充一个数组(实际上非​​常多,而且有点慢)。我正在使用该数组来构建表的行。

我尝试在我的代码中的许多地方调用fetchData,在视图构造的不同时间,我似乎总是得到以下内容:显示黑色屏幕,直到数组中的数据加载。我从下面调用了fetchData:

  • (无效)viewDidLoad中;
  • (无效)viewWillAppear中:(BOOL)动画;
  • (无效)viewDidAppear:(BOOL)动画;

由于我使用导航视图控制器,让应用程序看起来挂起是非常糟糕的,因为它卡在黑屏上。我希望我的代码能实现的是显示一个空表,带有进度指示器,直到数据加载 - 然后刷新。不幸的是,我没有这么做,因为无论我在哪里调用fetchData都没有加载视图。

帮助表示赞赏!

P.S。为了解决这个问题,我甚至尝试使用TTTableViewController,但从不显示加载视图。典型。 叹息

3 个答案:

答案 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;
}