我有一个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;
}
答案 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/