如何加快这个表视图行?

时间:2011-01-17 11:38:36

标签: iphone objective-c uitableview performance


我使用带有自定义值和图像的表格视图。

每行都这样做
- 检查设备(iphone / ipad)
- 解析wordpress xml
- 拆分此字符串“星期四,2011年1月13日22:26:27 +0000”并获得pos [1]和pos [2]。
- 转换“Gennaio”中的“Jan” - 在行单元格中设置值

以这种方式制作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
    @try {
        newsRow = ((NewsRowController *)[tableView dequeueReusableCellWithIdentifier:@"cell"]);
        if (newsRow == nil) {

            if ( [[Device GetModel] isEqualToString:@"iPad Simulator"] || [[Device GetModel] isEqualToString:@"iPad"])
                [[NSBundle mainBundle] loadNibNamed:@"NewsRow_ipad" owner:self options:nil];
            else [[NSBundle mainBundle] loadNibNamed:@"NewsRow" owner:self options:nil];

            if ([tableArray count] > 0) {               
                NSArray *chunks = [[dataArray objectAtIndex:indexPath.row] componentsSeparatedByString: @" "];

                [newsRow setCellDataWithName:[tableArray objectAtIndex:indexPath.row]  
                                     andDate:[descArray objectAtIndex:indexPath.row] 
                                         day:[chunks objectAtIndex:1] 
                                       month:[self convertMonthToExtended:[chunks objectAtIndex:2]]];
            }
        }       
    }
    @catch (NSException * e) {
        NSLog(@"OK, crashato. Sappiamo il perchè!");
    }

    return newsRow;
}

函数convertMonthToExtended执行此操作:

if ([small isEqualToString:@"Jan"]) return @"gennaio";
[...]
if ([small isEqualToString:@"Dec"]) return @"dicembre";

现在,在模拟器上它工作得非常好,但在设备上,尤其是3G设备,当我滚动表格时它会慢慢滚动,因为我做了很多事情。

我如何加快滚动
重新实现此功能的正确方法是什么?更快? 如何优化此代码段?

请问好吗?

感谢,

2 个答案:

答案 0 :(得分:1)

我原本以为将这些信息以块的形式批量处理到一个中间数据存储中是一种更好的方法,该数据存储将用于支持UITableView,因为在单元格内进行计算会导致问题描述。 (根据处理的持续时间,您可能希望在处理数据时显示UIActivityIndicatorView。)

通过这样做,您应该可以无需单独处理每一行的XML数据等等,虽然从原始处理角度来看这可能不会明显加快,但从用户的角度来看,它至少会感觉更快,这可能是关键问题。

答案 1 :(得分:1)

我认为您可以移动以下代码:

if ( [[Device GetModel] isEqualToString:@"iPad Simulator"] || [[Device GetModel] isEqualToString:@"iPad"])
                [[NSBundle mainBundle] loadNibNamed:@"NewsRow_ipad" owner:self options:nil];
            else [[NSBundle mainBundle] loadNibNamed:@"NewsRow" owner:self options:nil];

在tableView:cellForRowAtIndexPath:方法之外,因为您不需要对每一行执行此检查(设备不会逐行更改)。您可以将此代码放在viewDidLoad

我建议你做所有的计算和异步网络的工作。 只有在所有操作填充表视图后,您才可以预先计算填充行所需的所有信息并将其保存在这样的NSArray中,同时查看UIProgressView或类似内容。 您可以使用[Tableview reloadData]方法重新加载表格视图中的所有数据,这意味着会调用numberOfSectionsInTableView:tableView:numberOfRowsInSection:和所有数据源方法。