在viewDidLoad中执行对服务器的调用

时间:2013-11-29 02:23:07

标签: ios objective-c viewdidload afnetworking-2 svprogresshud

我在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进度加载,但是每次显示视图时都会调用此方法,我不希望这样......

非常感谢!

2 个答案:

答案 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];
        }];
    });
}