滚动UITableView有点生涩

时间:2012-10-25 03:42:39

标签: ios

我有一个UITableView,其中包含所有单元格的图像,但是所有图像都已经在单元格中(我没有自己设置图像)并且它们都是从包含在中的图像中加载的。该项目。这些不是从服务器或任何东西加载的图像。但是,滚动的tableview仍然是一些生涩的东西。有什么办法可以加快速度吗?我有在这里生成单元格的功能:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Post init, update with the fair info so it can attend/de-attend on its own
    CompaniesCustomCell *cell = [CompaniesCustomCell dequeOrCreateInTable:tableView];
    SectionInfo *sectionInfo = [sectionInfoArray objectAtIndex:indexPath.section];
    cell.fairDictionary = [sectionInfo.arrMDetails objectAtIndex:indexPath.row];
    [cell updateEventIcon:(NSString*)[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"TYPE"]];

    cell.lblFairName.text = [[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"TITLE"];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    // Set event start time, end time, and date
    NSString *newDate = [MyUtil convertToLocalTime:@"MMMM dd, yyyy" :[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"START_TIME"]];        
    NSString *startString = [MyUtil convertToLocalTime:@"hh:mm a" :[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"START_TIME"]];
    NSString *endString = [MyUtil convertToLocalTime:@"hh:mm a" :[[sectionInfo.arrMDetails objectAtIndex:indexPath.row] valueForKey:@"END_TIME"]];

    cell.lblFairDate.text = newDate;
    cell.lblFairStartTime.text = startString;
    cell.lblFairEndTime.text = endString;
    return cell;
}

我做错了什么可能会减慢它的速度?

修改

我在这里包含convertToLocalTime函数的代码,因为我认为这可能是根本原因。但是......我真的很困惑如何优化它。我从服务器(UTC)中获取时间戳值,并将其转换为用户本地时区。这个过程真的那么慢吗?

// Converts given time string into the users current timezone
// based on the location of their phone
+(NSString *)convertToLocalTime:(NSString*)format :(NSString*)stringDate {

    // Get the date in the servers time zone
    NSDate *date = [MyUtil convertToServerDate:stringDate];

    // Convert the date to the local timezone
    NSDateFormatter *localFormat = [[NSDateFormatter alloc] init];
    [localFormat setDateFormat:format];
    NSString *localDate = [localFormat stringFromDate:date];

    [localFormat release];
    return localDate;
}

// Provides a NSDate object with the servers timezone set
+(NSDate *)convertToServerDate:(NSString*)stringDate {

    // First get the NSDate object in the servers timezone
    NSTimeZone *tz = [NSTimeZone timeZoneWithName:ServerTimezone];
    NSDateFormatter *inFormat = [[NSDateFormatter alloc] init];
    [inFormat setDateFormat:@"yyyyMMddHHmmss"];
    [inFormat setTimeZone:tz];
    NSDate *date = [inFormat dateFromString:stringDate];

    [inFormat release];
    return date;
}

3 个答案:

答案 0 :(得分:2)

如同EarlyRiser所说,请检查您的日期实用程序代码。但是,因为它是类方法,所以需要创建新对象。

要尝试的另一件事是让自定义单元格类更改标签。您可以在设置fairDictionary时执行此操作。我假设您在自定义单元格的.h中使用了@property on fairDictionary。

在自定义单元格的.m中,覆盖fairDictionary的set方法 所以在@synthesize的顶部做:

@synthesize fairDictionary = _fairDictionary;

然后在.m文件中的某处调用一个方法:

- (void)setFairDictionary:(NSDictionary *)fairDictionary {
_fairDictionary = fairDictionary;
[cell updateEventIcon:(NSString*)[_fairDictionary valueForKey:@"TYPE"];
self.lblFairName.text = [_fairDictionary valueForKey:@"TITLE"];

等等。所以代替表数据源处理设置标题等。自定义类将在设置字典时进行。

希望这可以提供帮助。

答案 1 :(得分:1)

我最近做了大量的UITableView优化,你最好的朋友是时间分析器工具。如果您不知道如何使用它,那么您应该学习,这是一个救生员。

这是tutorial

您可能想要查看的一件事是您的日期实用程序代码。它里面有什么作用?你每次调用它时都在创建NSCalendar对象吗?这足以扼杀你的表现。但如果没有剖析,真的很难知道。

答案 2 :(得分:1)

我已经在这个问题上苦苦挣扎,所以我非常清楚你的问题。 UITableView生涩吗?我很惊讶所有答案都指向日期功能。你可以把所有这些都拿走,它仍然会生涩。

为什么呢?这是懒惰的图像解压缩。即使所有图像都来自应用程序包,ios也会在屏幕上显示时执行解压缩。您必须在后台线程中手动解压缩图像。

解压缩不仅仅意味着实例化UIImage对象。它可能有点复杂。最好的解决方案是下载SDWebImage并使用包含的图像解压缩程序。

要详细了解该问题,请参阅:http://www.cocoanetics.com/2011/10/avoiding-image-decompression-sickness/