2011-05-25 69 views
1

我正面临一个奇怪的问题。我有一个方法用一些数据(fetchData)填充数组(实际上相当多,而且有点慢)。我正在使用该数组来构建表的行。TableViewController的表视图直到数据加载才显示

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

  • (void)viewDidLoad;
  • (void)viewWillAppear:(BOOL)animated;
  • (void)viewDidAppear:(BOOL)animated;

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

帮助感谢!

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

回答

2

您的加载方法必须阻止用户界面。你应该将它移动到另一个线程并让数据加载到那里。你可以在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]; 
    }) 
}) 
+2

请注意,在另一个线程中获取数据之后,UI的任何更改都必须在主线程中完成。 – 2011-05-25 22:43:13

+0

这听起来很可怕。我以前没有处理过多个线程。我可以使用Grand Central Dispatch吗?你有任何可以工作的例子吗? – 2011-05-25 22:44:00

+0

有几个有用的指南,但我建议[这](http://cocoasamurai.blogspot。COM/2009/09 /导向到块-隆重-中央dispatch.html)。我已经编辑了一个关于你最终会做什么的总体思路。 – 2011-05-25 22:54:45

1

有可能,你可以添加一个计时器到某处延缓你的viewDidAppear方法调用了一个框架代码,你需要。例如:

- (void)viewDidAppear:(BOOL)animated { 
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fetchData) userInfo:nil repeats:NO]; 
} 

这会让您的应用程序有时间加载用户界面并开始加载屏幕,然后再开始提取数据。你也可以尝试在后台线程中获取数据,如果你更愿意走这条路线

0

我有一个问题,最初没有加载表视图,但它工作n另一个.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; 
} 
相关问题