我在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视图但没有任何反应。
我正在viewDidLoad
中执行调用,因为我需要在加载视图后立即调用,我只想调用一次。
如果我将此代码块移动到viewDidAppear
进度加载,但是每次显示视图时都会调用此方法,我不希望这样......
非常感谢!
答案 0 :(得分:0)
一个技巧可以使用NSUserDefaults来保存像@“serverAlreadyCalled”这样的值,如果之前调用了服务器,则检查viewDidAppear。 例如:
-(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”。
也许这不是最好的解决方案,但可以成功。 希望它有所帮助。
答案 1 :(得分:0)
问题不在于,如果在viewDidLoad
中完成,则不会发生网络呼叫(因为这是正确的地方),而是尝试添加SVProgressHUD
viewDidLoad
无效,因为在为view
构建SVProgressHUD
以确定放置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];
}];
});
}