要求是在应用启动后立即调用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()?
答案 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
以获取更准确的活动指标。如果您的请求响应时间足够长,让用户想知道是否发生了任何事情(例如,超过几秒钟),我建议您研究这种方法。