2012-06-15 113 views
0

我第一次使用-drawRect来尝试加速UITableView。但是,drawRect方法似乎在很大程度上减缓了桌子的放置。iOS - DrawRect性能问题

请你能告诉我如何改进下面的drawRect方法以加快表格的速度吗?

编辑---

在drawRect方法,我写两个NSString的到小区的观点,二UIImages和阴影到两个NSString的和UIImages之一。

其中一个上述图像是异步下载的,然后调用setNeedsDisplay将UIImage绘制到屏幕上。我相信这最初可能是滞后发生的原因。

- (void) drawRect:(CGRect) rect { 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    [[UIColor clearColor] set]; 

    CGContextFillRect(context, rect); 

    CGContextSaveGState(context); 
    CGContextSetShadow(context, CGSizeMake(1,1),1); 
    //draw text here 

    if (shouldDrawImage == YES) { 

     CGContextDrawImage(context, CGRectMake(10, 10, 40, 40), self.image.CGImage); 

    } 

    CGContextDrawImage(context, CGRectMake(self.frame.size.width - 16, 0, 16, self.frame.size.height), [UIImage imageNamed:@"right_bar_including_holes"].CGImage); 

    NSString *authorName = [[self.info objectForKey:@"user"] objectForKey:@"full_name"]; 

    [RGB(219, 240, 73) set]; 

    CGSize maximumLabelSize = CGSizeMake(self.frame.size.width - 10 - 55 - 16,9999); 
    CGSize authorsize = [authorName sizeWithFont:[UIFont boldSystemFontOfSize:15] 
            constrainedToSize:maximumLabelSize 
             lineBreakMode:UILineBreakModeWordWrap]; 
    [authorName drawInRect:CGRectMake(60, 10, self.frame.size.width - 60, authorsize.height) withFont:[UIFont boldSystemFontOfSize:15]]; 

    [RGB(249,249,249) set]; 

    NSString *description = [self.info objectForKey:@"description"]; 
    CGSize descriptionSize = [description sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; 

    [description drawInRect:CGRectMake(60, authorsize.height + 15, descriptionSize.width, descriptionSize.height) withFont:[UIFont systemFontOfSize:14]]; 

    CGContextRestoreGState(context); 

} 

- (NSString *) reuseIdentifier { 
    return NSStringFromClass([SlideCell class]); 
} 

- (void) updateCellInfo:(NSDictionary *)_info { 
    [self setInfo:_info]; 

    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)]; 
    [iv setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[self.info objectForKey:@"user"] objectForKey:@"avatar"]]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *_image) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      shouldDrawImage = YES; 
      self.image = [self roundedImage:_image]; 
      [iv release]; 
      [self setNeedsDisplay]; 
     }); 

    } failure:nil]; 

    [self setNeedsDisplay]; 

    [self setSelectionStyle:UITableViewCellSelectionStyleNone]; 
} 
+1

这将帮助你的问题,如果你解释为什么你正在使用的drawRect,你用它做什么具体的,而不是指望有人通过您的代码来查看可能存在的问题。 –

+0

@skinnyTOD我编辑了这个问题,谢谢你的输入。 –

+1

覆盖drawRect以提高性能似乎误导了我。你正在假设你编写了更高效的代码,然后编写了UITableView的人。我敢打赌,有一个更容易和更有效的解决方案。 – sosborn

回答

2

是 - 你对你的应用程序运行仪器的时间配置文件来告诉你到底有多少时间花在和其中。它会告诉你,如果它是图像,字符串,阴影或其他东西。

1

您应该剖析该代码,并首先查看图像是否是问题。

我不知道如何在异步下载图像时使用AFNetworking库(您正在使用)。

如果您知道该图像是问题,我怀疑图像需要在UIImageView设置时重新缩放。这可能是问题所在。您需要将要设置为UIImageView的UIImage重定标到UIIImageView的框架,因此没有autorescaling触发器。滚动时代价高昂。

您会收到图像并立即向主线程发送代码。潜在的重新标定可能在'引擎盖下'工作。我想改变这种状况的方法:

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, IMGSIZEX, IMGSIZEY)]; 
    [iv setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[[self.info objectForKey:@"user"] objectForKey:@"avatar"]]] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *_image) { 
     //Note you have to implement rescaleToFitSize 
     UIImage* rescaled = [_image rescaleToFitSize:iv.frame.size]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.image = _image; 
      [iv release]; 
      [self setNeedsDisplay]; 
     }); 

    } failure:^{ 
     //Handle failure! You create mem. leak on failure 
     [iv release]; 
}]; 

作为一个侧面说明,你不处理图像下载失败。你明确应该。

+0

同意。您可以从占位符empy映像开始,并在异步下载完成后更新它(如果有问题的单元仍需要该映像)。 –

1

股票的UITableView是有效的,因为它得到,只要你使用它正确:只要更多钞票(alpha混合DOES慢下来),再利用细胞 3.配置没有按 1.回收细胞(离队) 2.避免透明度花费很多处理时间。

我不认为任何人都可以通过重写的drawRect苹果的代码显著改善...

+1

如果您的单元格中有很多子视图,滚动性能会受到影响。拥有一个自定义内容视图并手动绘制全部视图可以提高性能。 – jrturton

+1

是的,但使视图不透明有很大帮助(例如,设置标签背景颜色以匹配内容视图的颜色,而不是clearColor)。无论如何,你应该重写单元格的drawRect,而不是表格的。 –

+1

完全同意,我认为提问者_is_覆盖了一个单元格,而不是表格,但目前还不清楚。 – jrturton