3

我对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进度 hud 加载,但是每次显示视图时都会调用此方法并且我不想要这个...

非常感谢!

4

2 回答 2

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

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

于 2013-11-29T02:47:02.040 回答
0

问题不在于网络调用在 in 完成时不会发生viewDidLoad(因为那是做它的正确位置),而是尝试添加SVProgressHUDinviewDidLoad将不起作用,因为这在过程中为时过早构建viewforSVProgressHUD以确定 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];
        }];
    });
}
于 2013-11-29T05:10:03.130 回答