2013-07-22 26 views
2

我試圖從web-services加載數據並插入UITableViewController在webservices之前加載UITableViewController

我可以成功地做到這一點,但問題是,它將在第一個UIView短時間「掛起」,然後在從互聯網加載web-servicesUITableViewController之前。如果網速很慢,它會延長hang

任何機會我可以首先顯示空的UITableViewController帶有「加載」符號,然後纔開始檢索web-services中的數據並重新加載表格?

目前,我把用來調用web-services的功能

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self._completeList = [[NSMutableArray alloc]init]; 
    self._completeList = [self getListFromWebServices]; 
} 

回答

5

Best方法,因爲我的建議,你必須使用Grand Central Dispatch (GCD)像波紋管爲例

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     //code for webservices calling 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      //reload you tableview here 
      [self.tableview reloadData]; 
     }); 
    }); 
0

你會在陣列和numberOfRows方法使用array.count來存儲數據。

您應該在viewDidLoad中分配init數組,並啓動輔助線程從網上下載數據。

[self performSelectorInBackground:@selector(getListFromWebServices) withObject:nil]; 

當下載完成後,在主線程上調用表reloadData。

[self.table performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

因此下載dataArray中的計數之前是零,你會得到空白表

0

最簡單的解決辦法是將這些代碼兩行進入 - (空)viewDidAppear:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self._completeList = [[NSMutableArray alloc]init]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    self._completeList = [self getListFromWebServices]; 
    // Assuming that [self getListFromWebServices] is a blocking call. 
    [self.tableView reloadData]; 
} 

但我會建議使用GCD加載您的數據異步:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     _completeList = [[NSMutableArray alloc] init]; 
     dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     self._completeList = [self getListFromWebServices]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.tableView reloadData]; 
     }); 
     }); 
    } 
    return self; 
} 
0

加成@Durgaprasasad答:

dispatch_async(backgroundQueue, ^{ 
     aResult = [self getListFromWebServices]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self updateMyUIWithResult: aResult]; 
     });  
    });