【问题标题】:Objective-C JSON to TableView very slowObjective-C JSON 到 TableView 非常慢
【发布时间】: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;
}

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

谢谢

【问题讨论】:

    标签: objective-c json uitableview


    【解决方案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 中,然后将该数据保存在全局变量中。

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

    【讨论】:

    • 类的任何局部变量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2015-08-28
    相关资源
    最近更新 更多