如何提高混合性能以实现平滑滚动?

时间:2010-09-04 19:09:16

标签: iphone web-services performance uitableview uiimage

快速介绍

编辑:我有9个单元格。所有9个单元格都包含图像。 7个图像束具有某种透明度(文件中的,而不是代码中的混合选项),以从其下方的Web加载图像。当bundle和web图像作为UIImage对象加载到数组中时,滚动问题会影响表视图。

如果我禁用Web图像的绘制滚动很漂亮,当我从捆绑滚动禁用图像时相当不错。但是你会得到你不想要的东西:糟糕的用户体验。

实施

我正在使用模型,你有一个自定义 UITableViewCell ,其中一个自定义 UIView 设置为Cell {{1 }} 即可。

自定义backgroundView包含两个单元格大小的图片( 320x80像素)。所有元素都设置为不透明并具有1.0 Alpha属性,但其中一个图像部分 100%透明。

我没有重复使用Cell,因为我没有让它们加载不同的图像。 Cell一次性重复使用,最多可重复使用9个单元。所以我在内存中有9个可重复使用的单元格。也许这就是问题所在。

单元格UIView方法部分:

initWithStyle:reuseIdentifier

CustomCellView 的初始化方法:

CGRect viewFrame = CGRectMake(0.0f, 0.0f, 320.0f, 80.0f);
customCellView = [[CustomCellView alloc] initWithFrame:viewFrame];
customCellView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self setBackgroundView:customCellView];

使用 UIImage的 {{1方法( 异步下载后)。

在图像加载方法中将它们设置为可见单元格,并在UITableViewDelegate方法- (id)initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { self.opaque = YES; self.backgroundColor = [UIColor UICustomColor]; } return self; } 中将从保存到的数组中设置为,并通过UITableViewCell通过自定义方法传递给UIView。 / p>

然后用UIView的imageWithData:覆盖方法绘制:

tableView:cellForRowAtIndexPath:

如您所见,正在使用drawRect:方法绘制图像。

问题

好吧,当- (void)drawRect:(CGRect)rect { CGRect contentRect = self.bounds; if (!self.editing) { CGFloat boundsX = contentRect.origin.x; CGFloat boundsY = contentRect.origin.y; CGPoint point; point = CGPointMake(boundsX, boundsY); if (firstImage) { [firstImage drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; } if (secondImage) { [secondImage drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; } } } 在设备上滚动时,您每次加载新内容时都会注意到(通知对用户不利,非常糟糕)停机时间滚动期间的单元格。

编辑:问题更多的是混合问题,在代码中您看到互联网图像正在已经在捆绑中绘制 - 没有绘制重叠图像使滚动速度提高70%。

思想

从bundle中加载图像时,相同的实现没有停机时间。我应该将图像保存到Application Sandbox,然后从那里使用它们。它听起来非常糟糕,因为您应该最小化移动设备应用程序中的读写操作,因为每次读取或写入时磁盘都会慢慢死亡。

编辑:或者我应该将图像存储为核心图形对象?

修改this问题中有一些线索。但我不知道如何有效地进行自定义绘图。

3 个答案:

答案 0 :(得分:1)

首先,您应该尝试让您的表格单元格可重复使用..这将对内存使用和响应能力产生重大影响..

为了在tableView中加载来自Web的图像我使用了这个link text解决方案。它使用ASIHTTPRequest框架下载数据异步,并且具有自定义可重用单元格。

您可以按原样使用它,也可以根据需要调整它...您可以在显示tableView之前将所有图像下载为异步,并将它们保存在缓存中。使用上面链接中提出的代码从缓存加载图像而不是从Web加载图像。如果你这样做,你可能会在一个时刻下载比用户需要更多的数据。(如果有人使用3G并且流量有限,他就不会喜欢额外的流量......)

更好的解决方案是仅在需要时下载图像。您可以按原样使用代码并添加缓存模块。下载图像后,将其保存在字典中,下次请求从那里加载...

每次我需要在UITableView单元格中加载图像时,最后一种方法就足够了。无需将图像保存为Core Graphics对象。

希望它有所帮助...

修改 another solution用于在tableview中加载具有可重用单元格的图像

答案 1 :(得分:1)

来自http://iphoneincubator.com/blog/tag/uiimage

这样的东西可以组合两个图像。 只有9行,你应该没有任何延迟。

- (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 {  
UIGraphicsBeginImageContext(image1.size);  

// Draw image1  
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];  

// Draw image2  
[image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];  

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();  

UIGraphicsEndImageContext();  

return resultingImage;  
}  

答案 2 :(得分:0)

尝试构建一个图像缓存,它是一个新的obj-c对象,它只返回你需要的UIImage,最多可以保存最近50个左右请求的UIImage。然后单元格绘制它只是询问缓存对象的图像 - 并立即获取它,或者缓存对象开始下载它。

UImage* theImage = [myImageCache imageForURL:urlForPNGImage]; 
[theImage drawinRect:rectForImageInCell];

// imageCache有一个UIImages字典,图像以URL作为密钥存储。您还需要跟踪上次使用时间等内容,以便控制内存。

此外,对于您使用的任何图像缓存,您需要加载用户尚未看到的行的图像。只需在所示行的两侧加载10(或其他一些数字)。然后图像准备好了。 即打电话

for (rows unseenButNearTheView)
 urlForRow = blah
 [myImageCache imageForURL:urlForRow];