在webservices之前加载UITableViewController

时间:2013-07-22 09:17:48

标签: iphone ios web-services uitableview

我正在尝试从web-services加载数据并插入UITableViewController

我可以成功地做到这一点,但问题是,当它从互联网上加载UITableViewController之前,它会在第一个UIView“挂起”,然后转到web-services。如果互联网速度很慢,它会hang更长。

我是否有机会首先使用“正在加载”标志显示空UITableViewController,然后才开始从web-services检索数据并重新加载表格?

目前,我将用于调用web-services的函数放在

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

4 个答案:

答案 0 :(得分:5)

最好的方法,因为我的建议你必须使用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];
        });
    });

答案 1 :(得分:0)

您将使用array.count将数据存储在数组和numberOfRows方法中。

您应该在viewDidLoad中分配init数组并启动辅助线程以从net下载数据。

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

下载完成后,在主线程上调用表reloadData。

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

因此,在下载dataArray之前,计数将为零,您将获得空白表

答案 2 :(得分:0)

最简单的解决方案是将这两行代码移到 - (void)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;
}

答案 3 :(得分:0)

除了@Durgaprasasad而且:

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

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