2

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

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

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

目前,我把用来调用的web-services函数

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

4 回答 4

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];
        });
    });
于 2013-07-22T09:26:28.543 回答
0

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

您应该在 viewDidLoad 中分配初始化数组并启动辅助线程以从网络下载数据。

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

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

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

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

于 2013-07-22T09:22:35.927 回答
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;
}
于 2013-07-22T09:23:35.500 回答
0

除了@Durgaprasasad Ans:

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

        dispatch_async(dispatch_get_main_queue(), ^{
            [self updateMyUIWithResult: aResult];
        });    
    });
于 2013-07-22T09:26:41.910 回答