我正在尝试从web-services加载数据并插入到UITableViewController中。
我可以成功地做到这一点,但问题是,当它从互联网加载web-services时,它会在第一个UIView上挂起一小段时间,然后转到UITableViewController。如果网速慢,它的hang会更长。
我是否可以先显示带有“正在加载”标志的空UITableViewController,然后只开始从web-services中检索数据并重新加载该表?
目前,我将用于调用web-services的函数放在
- (void)viewDidLoad
{
[super viewDidLoad];
self._completeList = [[NSMutableArray alloc]init];
self._completeList = [self getListFromWebServices];
}发布于 2013-07-22 17:26:29
最佳方法作为我的建议,您必须使用Grand Central Dispatch (GCD),如bellow作为示例
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//code for webservices calling
dispatch_async(dispatch_get_main_queue(), ^{
//reload you tableview here
[self.tableview reloadData];
});
});发布于 2013-07-22 17:22:36
您将使用array.count将数据存储在数组和numberOfRows方法中。
你应该在viewDidLoad中分配初始化数组,并启动辅助线程从net下载数据。
[self performSelectorInBackground:@selector(getListFromWebServices) withObject:nil];下载完成后,调用主线程上的表reloadData。
[self.table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];因此,在下载dataArray之前,计数将为零,您将得到空白表
发布于 2013-07-22 17:23:36
最简单的解决方案是将这两行代码移到-(无效)viewDidAppear中:
- (void)viewDidLoad {
[super viewDidLoad];
self._completeList = [[NSMutableArray alloc]init];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self._completeList = [self getListFromWebServices];
// Assuming that [self getListFromWebServices] is a blocking call.
[self.tableView reloadData];
}但我建议您使用GCD异步加载数据:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
_completeList = [[NSMutableArray alloc] init];
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self._completeList = [self getListFromWebServices];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
});
});
}
return self;
}https://stackoverflow.com/questions/17783776
复制相似问题