我是iOS开发的新手,遇到了以下问题。我需要用从服务器获取的数据填充UITableView。
我正在使用AFNetworking
进行此呼叫。我想使用SVProgressHUD
显示"加载视图",我正在执行以下操作:
-(void) viewDidLoad{
[super viewDidLoad];
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient];
[[MyServer sharedManager] fetchFromServerwithCompletionHandler:^(NSArray *elements, BOOL error) {
_elements = elements;
[_elementsTableView reloadData];
[SVProgressHUD dismiss];
}];
}
我从服务器上得到了正确的答案,但进度hud没有显示。对服务器的调用确实需要几秒钟的时间,因此有时间加载进度hud视图,但什么也没发生。
我在viewDidLoad
中执行调用,因为我需要在加载视图后立即进行调用,并且我只想调用一次。
如果我把这段代码移到viewDidAppear
,进度hud就会加载,但每次显示视图时都会调用这个方法,我不希望这样。。。
非常感谢!
问题不在于如果在viewDidLoad
中完成网络调用就不会发生(因为这是正确的位置),而在于尝试在viewDidLoad
中添加SVProgressHUD
是行不通的,因为在为SVProgressHUD
构建view
的过程中,要想把HUD放在哪里还为时过早。
一个简单的解决方案是让viewDidLoad
推迟对此的调用,以使UI有机会进入SVProgressHUD
可以正确地将自己放置在视图层次结构中的状态。尽管看起来很傻,但您可以将代码发送回主循环,这给了UI一个迎头赶上的机会:
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(dispatch_get_main_queue(), ^{
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient];
[[MyServer sharedManager] fetchFromServerwithCompletionHandler:^(NSArray *elements, BOOL error) {
_elements = elements;
[_elementsTableView reloadData];
[SVProgressHUD dismiss];
}];
});
}
如果您以前调用过服务器,可以使用NSUserDefaults来保存一个值,如@"serverAlreadyCalled",并检查viewDidPappear。示例:
-(viewDidAppear){
NSUserDefaults* defaults = [NSUserDefaults standardDefaults];
if ([defaults valueForKey:@"serverAlreadyCalled"] == nil) {
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient];
[[MyServer sharedManager] fetchFromServerwithCompletionHandler:^(NSArray *elements, BOOL error) {
_elements = elements;
[defaults setValue:@"YES" forKey:@"serverAlreadyCalled"];
[_elementsTableView reloadData];
[SVProgressHUD dismiss];
}];
}
}
在应用程序运行完成之前,不要忘记将nil设置为您的密钥@"serverAlreadyCalled"。
也许这不是最好的解决方案,但可以成功。希望能有所帮助。