Objective-C JSON 到 TableView 非常慢

Posted

技术标签:

【中文标题】Objective-C JSON 到 TableView 非常慢【英文标题】:Objective-C JSON to TableView very slow 【发布时间】:2013-08-06 14:07:11 【问题描述】:

我有一个问题。我从我的 URL 获取 JSON,它看起来像这样:

- (NSMutableArray *)parseObject:(NSString *)object withKey:(NSInteger)key 
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *randomKey = [standardUserDefaults stringForKey:@"randomKey"];

NSString *urlString = [NSString stringWithFormat:@"http://domain.com"];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [NSData dataWithContentsOfURL:url];
NSError *error;
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

NSArray* latestLoans = [json objectForKey:@"object"];
NSDictionary* loan = [latestLoans objectAtIndex:key];

NSArray *myWords = [[loan objectForKey:object] componentsSeparatedByString:@","];

return myWords;

到我的 TableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];


cell.textLabel.text = [[self parseObject:@"bedrijfsnaam" withKey:0] objectAtIndex:indexPath.row];
//cell.detailTextLabel.text = [[self parseObject:@"leverunix" withKey:0] objectAtIndex:indexPath.row];
cell.textLabel.font = [UIFont systemFontOfSize:14.0];
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 3;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;

它加载非常缓慢,当我想滚动时我有一种滞后。我可以做些什么来改善它?

谢谢

【问题讨论】:

【参考方案1】:

您似乎每次从服务器获取 JSON 数据,cellForRowAtIndexPath 被调用。那一定很慢!

您应该只获取一次数据(例如在viewDidLoad 中),反序列化 JSON 并将结果存储在视图控制器的某个属性中,以便cellForRowAtIndexPath 可以从那里获取对象。

【讨论】:

我在 viewDidLoad 中有一个数组,并将我的所有数据放入该数组中,它现在可以正常工作了。谢谢 更一般地说,您在主线程上执行阻塞操作,这意味着在收到并解析 JSON 响应之前不会创建单元格。如果服务器需要 30 秒响应,您的应用将在 30 秒内无响应!!! @HenkdeBoer:不客气。 - 但也看看 timthetoolman 的答案。即使是单个 URL 请求也可能需要很长时间,因此异步(或在后台线程中)获取数据以避免主 UI 阻塞也是不错的建议。【参考方案2】:

你来电

NSData *data = [NSData dataWithContentsOfURL:url]; 

导致主线程在从 Web URL 检索数据时阻塞。

尝试使用异步方法。它会解决问题。

【讨论】:

谢谢,非常有帮助。【参考方案3】:

你在打电话

 - (NSMutableArray *)parseObject:(NSString *)object withKey:(NSInteger)key

在 cellForRowAtIndexPath 中一次又一次。

这不应该发生。

尝试将数据保存在 viewDidLoad 或 viewWillAppear 中,然后将该数据保存在全局变量中。

现在调用将从该变量中获取数据并返回所需值的任何函数。

【讨论】:

类的任何局部变量

以上是关于Objective-C JSON 到 TableView 非常慢的主要内容,如果未能解决你的问题,请参考以下文章

JSON 到 Objective-C 字典

将 JSON 导入到 Objective-C 时的奇怪输出

在 IOS(Objective-C)中有效地解析 JSON 到 Realm DB

JSON到UITableView IOS Objective-C [关闭]

Objective-C JSON 到 TableView 非常慢

AFNetworking JSON 到 UITableView - Objective-C