Ios iCarousel在iPad上的性能问题

Ios iCarousel在iPad上的性能问题,ios,objective-c,icarousel,Ios,Objective C,Icarousel,我在用Nick Lockwood的iPad应用程序。现在它只是一个由15幅全屏图像组成的旋转木马 我设置了一个单视图项目,在故事板中添加了iCarousel视图,将其视图控制器添加为数据源,并将以下代码用于数据源方法: - (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel { return 15; } - (UIView *)carousel:(iCarousel *)carousel viewForItemAtInde

我在用Nick Lockwood的iPad应用程序。现在它只是一个由15幅全屏图像组成的旋转木马

我设置了一个单视图项目,在故事板中添加了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;
}
-(void)viewDidLoad{
[超级视图下载];
NSMutableArray*URL_aux=[[NSMutableArray alloc]init];

对于(int i=0;i很难确定,但我猜第一次是从文件中加载图像;而第二次是使用缓存副本-这是
+[UIImage imagename:]
会自动为您加载图像;如果没有它,您每次都会看到性能下降。您可以提前在应用程序代理或控制器的初始化器中加载图像

您可以做的另一件事是利用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;
}

更新:如果你能获得更多关于你的应用程序在哪里花费时间的信息,那就太好了。如果你使用,你可以得到每种方法花费时间百分比的明细。

看看他的例子:。他使用
AsyncImageView
而不是
UIImageView
,以异步方式加载图像。因此它不会尝试要同时加载所有15个图像,我认为它不应该有性能问题

我认为这不是一个非常传统的解决方案,但它是有效的

我所做的是使用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;
}
-(void)viewDidLoad
{
[超级视图下载];
self.images=[[NSMutableArray alloc]init];
self.carousel.dataSource=self;
self.carousel.type=iCarouselTypeLinear;

对于(int i=0;i可能异步加载图像,他有一些这样加载图像的示例。你能解释你的答案吗?是的,看看他的示例:。他使用异步ImageView而不是UIImageView,它以异步方式加载图像。因此它不会尝试同时加载所有15个图像,我认为使用sti不会有性能问题ll不会更改任何内容。我尝试将所有图像加载到NSArray(甚至所有UIImageView)但它仍然是一样的。重用现在不会改变任何事情,但这是一个明智的做法。有趣的是,阵列解决方案不起作用。你有没有在仪器中查看你的应用程序在哪里花费时间?我为其中一个峰值添加了调用树。我尝试复制该代码。没有任何变化。我认为问题在于icarousel sett第一次启动映像,而不是在我从磁盘加载映像时启动。看起来很好,没有任何线索。如果您使用全屏映像和线性模式,您是否考虑过UICollectionView?或PSTCollectionView(替代iOS>=4.3)顺便说一句,我想我已经解决了这个问题……(谢天谢地,我想我没有德雷克斯勒的计划,我想这是国际奥委会的协议)