2013-11-29 24 views
3

我很新的iOS開發,我有以下問題。我需要用從服務器獲取的數據填充UITableView。執行調用服務器在viewDidLoad

我做使用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負載,但隨後這種方法將被稱爲的每次視圖顯示,我不希望這樣......

謝謝很多!

回答

0

的問題不在於是否在viewDidLoad做(因爲這是做正確的地方),而是試圖加入viewDidLoadSVProgressHUD將無法​​正常工作的網絡通話不會發生,因爲在構建viewSVProgressHUD以確定將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]; 
     }]; 
    }); 
} 
+0

不錯的答案!非常感謝! – Peter

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]; 
}]; 
} 
} 

不要忘了零設爲您的鑰匙@「serverAlreadyCalled」你的應用程序結束運行前。

也許它不是最好的解決辦法,但可以使的伎倆。 希望它有幫助。

+0

它不好的做法,在這種情況下使用布爾變量保持單個呼叫。 – Tirth

+0

但爲什麼沒有在viewDidLoad中顯示?你知道嗎?服務器調用需要3秒鐘...(我同意@Reformer) – Peter

+0

正如我之前所說,也許這不是最好的解決方案。我使用創建一個類來管理與服務器的通信,並使用代表爲用戶提供一些反饋。 – scollaco