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

标签 ios uitableview nsurlsession nsurlsessiondatatask

我正在使用 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/

相关文章:

android - 我可以使用 Android studio Avd 管理器在 Windows 上运行 iOS 模拟器吗?

ios - 有时单元格加载顺序不正确?

swift - 为什么我的合并管道中从未调用 sink ?

ios - Swift:当图像文件存在于 Assets 中时,为什么它是 nil NSData?

ios - 将 iOS 崩溃报告导入 Xcode 6.1 时出现问题

ios - SWIFT:核心位置返回 nil - 如何调用 didUpdateLocations?

ios - 如何将项目添加到 UITableView?

ios - 字符串存储.plist不保存/加载并且不填充UITableView

ios - 在顶部添加单元格时使 UITableView 保持滚动位置

ios - NSURLSession dataTaskWithURL 非常 "slow"