如何在加载tableview之前执行API方法?

时间:2016-06-19 22:31:28

标签: ios objective-c

要求是在应用启动后立即调用edmunds API并在表格中显示供应商名称。

1)-getAPIData()

检索self.dealerName数组中的经销商和商店的名称。

-(void)getAPIData{
    NSURLSession *session = [NSURLSession sharedSession];
    self.task = [session dataTaskWithURL:[NSURL URLWithString:[NSString stringWithFormat:
                                                @"https://api.edmunds.com/api/dealer/v2/dealers?zipcode=%@&radius=%@&fmt=json&api_key=ycwedw68qast829zx7sn9jnq",
                                                @"01609",@"10"]]
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
      if (data.length > 0 && error == nil)
      {
          NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:data
                                                                   options:kNilOptions
                                                                     error:NULL];
          self.dealersDictionary = jsonData[@"dealers"];
          for (id item in self.dealersDictionary){
              if (item[@"name"] != nil){
                  self.dealerName = item[@"name"];
                  NSLog(@"%@",self.dealerName);
              }else{
                  NSLog(@"could'nt find the names");
              }
          }
      }
  }
 ];
}   

2)-viewDidLoad()

此方法调用getAPIData(上面的方法)。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self getAPIData];
}

3) - (NSInteger)tableView:(UITableView *)tableview numberOfRowsInSection:(NSInteger)section

返回经销商数量。

-(NSInteger)tableView:(UITableView *)tableview numberOfRowsInSection:(NSInteger)section
{
    [self.task resume];
    return self.dealerName.count;
}
在调用numberOfRowsInSection()之后,

getAPIData()方法正在执行。因此,表格呈现为空。

如何在屏幕上加载表之前调用getAPIData()?

2 个答案:

答案 0 :(得分:8)

简短的回答:你没有。您显示一个空表视图,然后在完成块中,您调用tableView的reloadData方法,然后它加载其内容。

答案 1 :(得分:0)

我认为这里的问题是NSURLSession dataTaskWithURL是异步的。

认为你可以继续使用异步方法并在调用成功返回后调用[self.tableView reloadData];(例如,在你的完成处理程序中)。您可以在等待负载完成时显示活动指示器。

或者您可以像这样制作阻止同步请求:

// define the URL
NSURL url = [NSURL URLWithString: @"https://api.edmunds.com/api/dealer/v2/dealers?zipcode=%@&radius=%@&fmt=json&api_key=ycwedw68qast829zx7sn9jnq"];

// attempt the request
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                    cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                    timeoutInterval:10];
[request setHTTPMethod: @"GET"];

NSError *reqError;
NSURLResponse *urlResponse;
NSData *returnedData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&reqError];

// parse `returnedData` here

现在您将拥有NSData对象,您可以像在completionHandler中一样解析它。如果您相信您的请求响应将快速返回,则此选项是可行的。

最终选项:使用NSURLConnection执行异步请求,并使用其- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data委托方法更新UIProgressView以获取更准确的活动指标。如果您的请求响应时间足够长,让用户想知道是否发生了任何事情(例如,超过几秒钟),我建议您研究这种方法。