我正在尝试从web-services
加载数据并插入UITableViewController
。
我可以成功地做到这一点,但问题是,当它从互联网上加载UITableViewController
之前,它会在第一个UIView“挂起”,然后转到web-services
。如果互联网速度很慢,它会hang
更长。
我是否有机会首先使用“正在加载”标志显示空UITableViewController
,然后才开始从web-services
检索数据并重新加载表格?
目前,我将用于调用web-services
的函数放在
- (void)viewDidLoad
{
[super viewDidLoad];
self._completeList = [[NSMutableArray alloc]init];
self._completeList = [self getListFromWebServices];
}
答案 0 :(得分:5)
最好的方法,因为我的建议你必须使用Grand Central Dispatch (GCD),如下面的例子
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];
});
});
答案 1 :(得分:0)
您将使用array.count将数据存储在数组和numberOfRows方法中。
您应该在viewDidLoad中分配init数组并启动辅助线程以从net下载数据。
[self performSelectorInBackground:@selector(getListFromWebServices) withObject:nil];
下载完成后,在主线程上调用表reloadData。
[self.table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
因此,在下载dataArray之前,计数将为零,您将获得空白表
答案 2 :(得分:0)
最简单的解决方案是将这两行代码移到 - (void)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;
}
答案 3 :(得分:0)
除了@Durgaprasasad而且:
dispatch_async(backgroundQueue, ^{
aResult = [self getListFromWebServices];
dispatch_async(dispatch_get_main_queue(), ^{
[self updateMyUIWithResult: aResult];
});
});