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 非常慢的主要内容,如果未能解决你的问题,请参考以下文章
在 IOS(Objective-C)中有效地解析 JSON 到 Realm DB
JSON到UITableView IOS Objective-C [关闭]