TableView的Objective-C JSON非常慢

时间:2013-08-06 14:07:12

标签: objective-c json uitableview

我有一个问题。我从我的网址获得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;
}

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

由于

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

致电

NSData *data = [NSData dataWithContentsOfURL:url]; 

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

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

答案 2 :(得分:0)

您正在致电

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

一次又一次地在cellForRowAtIndexPath。

这不应该发生。

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

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