我正在使用Nick Lockwood的iCarousel获取iPad应用。现在它只是一个由15个全屏图像组成的旋转木马。
我设置了一个视图项目,在storyboard中添加了iCarousel视图,将它的视图控制器添加为数据源,并将此代码放在数据源方法中:
- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel {
return 15;
}
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
UIImage* img = [UIImage imageNamed:[NSString stringWithFormat:@"image%d.jpg", index]];
UIImageView* imgView = [[UIImageView alloc] initWithImage:img];
return imgView;
}
这样可行,但是当我第一次滚动浏览所有项目时,您可以注意到在将新项目添加到轮播时会有轻微的性能损失。第二次浏览所有项目时都不会发生这种情况。
你可以在这个分析器截图中看到我的意思。上半部分的峰值是我第一次滚动浏览所有图像,然后我再次执行此操作,并且没有峰值且没有性能影响。
我该如何解决这个问题?
修改
我在仪器上分离了一个峰值,这是调用树
修改
带有jcesar建议的代码
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray* urls_aux = [[NSMutableArray alloc] init];
for (int i = 0; i<15; i++) {
NSString *urlPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"captura%d", i] ofType:@"jpg"];
NSURL *url = [NSURL fileURLWithPath:urlPath];
[urls_aux addObject:url];
}
self.urls = urls_aux.copy;
self.carousel.dataSource = self;
self.carousel.type = iCarouselTypeLinear;
}
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
if (view == nil) {
view = [[[AsyncImageView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)] autorelease];
view.contentMode = UIViewContentModeScaleAspectFit;
}
[[AsyncImageLoader sharedLoader] cancelLoadingImagesForTarget:view];
((AsyncImageView *)view).imageURL = [self.urls objectAtIndex:index];
return view;
}
答案 0 :(得分:1)
我认为这不是一个非常正统的解决方案,但它确实有效。
我所做的是使用iCarousel的方法insertItemAtIndex:animated:
在设置中一次添加一个图像。然后性能受到影响,但之后一切都顺利进行。
- (void)viewDidLoad
{
[super viewDidLoad];
self.images = [[NSMutableArray alloc] init];
self.carousel.dataSource = self;
self.carousel.type = iCarouselTypeLinear;
for (int i = 0; i<15; i++) {
UIImage* img = [UIImage imageNamed:[NSString stringWithFormat:@"captura%d.jpg", i]];
[self.images addObject:img];
[self.carousel insertItemAtIndex:i animated:NO];
}
}
- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel {
return self.images.count;
}
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
UIImage* img = [self.images objectAtIndex:index];
UIImageView* imgView = [[UIImageView alloc] initWithImage:img];
return imgView;
}
答案 1 :(得分:0)
很难确定,但我猜第一次通过它加载文件中的图像;而第二次使用缓存副本 - 这是+[UIImage imageNamed:]
自动为你做的事情;没有它,你会看到每次都有性能。您可以先在应用代理中或控制器的初始化程序中加载图像。
您可以做的另一件事是使用iCarousel的视图重用逻辑。我不认为它对你的问题负责,但你现在也可以这样做:
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view {
UIImage* img = [UIImage imageNamed:[NSString stringWithFormat:@"image%d.jpg", index]];
UIImageView* imgView = nil;
if ([view isKindOfClass:[UIImageView class]])
{
imgView = (UIImageView *)view;
imgView.image = img;
[imgView sizeToFit];
}
else
{
[[UIImageView alloc] initWithImage:img];
}
return imgView;
}
更新:获取有关您的应用花费时间的更多信息会很棒。如果您使用Instruments Time Profiler,则可以获得每种方法花费的时间百分比的明细。
答案 2 :(得分:0)
看看他的例子:Dynamic Downloads。他使用AsyncImageView
代替UIImageView
,以异步方式加载图片。所以它不会同时尝试加载所有15张图片,我认为它不应该有性能问题