gpt4 book ai didi

ios - 使用 nsurlsessiontask 导致 TableView 中的数据显示不正确并且更改将滚动

转载 作者:行者123 更新时间:2023-11-29 01:03:24 24 4
gpt4 key购买 nike

我正在使用 google places api 获取用户附近商店的详细信息。我从电话中得到的响应显示在表格 View 中。我进行了两次 api 调用。一个调用查找附近的商店,另一个调用获取有关每个返回的商店的信息,例如 url、电话号码、图片等。所以我首先在主线程上进行了这两个调用,这减慢了我的 UI。滚动时表格 View 滞后很多(但所有单元格都有正确的数据,向上或向下滚动时数据没有改变)。然后我决定使用 nsurlsessiontask 来执行这两个 api 调用,这样它就不会减慢 UI。这是代码:

第一次 api 调用:

s1 = @"Http request";
NSURL *jsonURL = [NSURL URLWithString:[self urlEncodeValue:s1]];
NSString *jsonDataString = [[NSString alloc]initWithContentsOfURL:jsonURL];

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:jsonURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data == nil || error != nil) {
NSLog(@"error: %@", error);
return;
}

NSError *parseError;
self.jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
if (self.jsonDict)
{
//perform taks
}

所以基本上我创建并初始化了 jsonDict,它是保存数据的字典。现在在我显示 tableview 的类中,我从 jsonDict 中获取数据并将其显示在单元格中。例如:

cell.addresslabel = [[[appDelegate.jsonDict objectForKey@"results"] objectAtIndex:indexPath.row] objectForKey:@"address"];

为了获得商店的电话号码和网站,我需要发出另一个 http 请求。所以我在显示 tableView 的同一个类中创建了一个方法。这是代码:

s2 = @"Second http request"
NSURL *jsonURL = [NSURL URLWithString:s2];

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:jsonURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data == nil || error != nil) {
NSLog(@"error: %@", error);
return;
}

NSError *parseError;
phoneDic = [NSJSONSerialization JSONObjectWithData:data options:0 error:&parseError];
if (phoneDic) {
//perform tasks
} else {
NSLog(@"parseError: %@", parseError);
NSLog(@"responseString: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
[task resume];

因此,当我这样做时,表格 View 不会“滞后”,但显示的数据不正确(单元格显示其他单元格的数据),当我向上或向下滚动时,数据会发生变化吗?因此,当我在主线程上执行任务时,有延迟但显示正确的数据,当我使用 nsurlsessiontask 时没有延迟但显示的数据不正确。我在 nsurlsessiontask 上做错了什么?

最佳答案

您的问题的原因是一旦 NSURLSessionTask 完成,该单元格可能会在完全不同的位置重复使用。在 cellForRowAtIndexPath 中将单元格出列后,您可以停止先前运行的任务并重新启动新任务。理想情况下,数据请求任务与 UITableView 中的呈现分开完成,包括接收数据的缓存。

关于ios - 使用 nsurlsessiontask 导致 TableView 中的数据显示不正确并且更改将滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36726829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com