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



我是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"。

也许这不是最好的解决方案,但可以成功。希望能有所帮助。

相关内容

  • 没有找到相关文章

最新更新