2013-04-05 116 views
2

我正在爲iPad應用程序使用Nick Lockwood的iCarousel。現在它只是15個全屏幕圖像的旋轉木馬。iPad上的iCarousel性能問題

我建立一個單一的視圖項目,添加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; 
} 

這工作,但我第一次當新項目被添加到旋轉木馬時,滾動瀏覽所有項目,您可以注意到一點性能問題。這在我第二次瀏覽所有項目時不會發生。

你可以在這個分析器截圖中看到我的意思。上半場的高峯是我第一次滾動瀏覽所有圖像,然後再次進行,沒有高峯,也沒有表現。

我該如何解決這個問題?

enter image description here

編輯

我孤立在儀器的山峯之一,這是調用樹

enter image description here

編輯

與jcesa代碼r的建議

- (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

也許是異步加載圖像,他有一些例子以這種方式加載圖像 – jcesarmobile 2013-04-05 10:09:07

+0

你能解釋你的答案嗎? – Odrakir 2013-04-05 10:22:17

+0

是的,看看他的例子:https://github.com/nicklockwood/iCarousel/tree/master/Examples/Dynamic%20Downloads。他使用AsyncImageView代替UIImageView,以異步方式加載圖像。所以它不會嘗試同時加載所有15張圖像,我認爲它不應該有性能問題 – jcesarmobile 2013-04-05 10:32:25

回答

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; 
} 
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; 
} 

UPDATE:這將是巨大的,得到您的應用程序將時間花在更多的信息。如果你使用Instruments Time Profiler,你可以得到每種方法花費的時間百分比。

+0

重複使用仍然不會改變任何內容。我嘗試將所有圖像加載到NSArray(甚至所有的UIImageViews)中,但它仍然是一樣的。 – Odrakir 2013-04-05 10:21:54

+0

重複使用現在不會改變任何東西,但這是明智的做法。有趣的是,陣列解決方案沒有奏效。您是否看過Instruments,看看您的應用在哪裏花費時間? – Simon 2013-04-05 10:23:48

+0

我爲其中一個峯添加了呼叫樹。 – Odrakir 2013-04-05 10:29:09

0

看他的例子:Dynamic Downloads。他使用AsyncImageView而不是UIImageView,它以異步方式加載圖像。所以它不會嘗試同時加載所有15張圖像,我認爲它不應該有性能問題

+0

我嘗試複製該代碼。沒有什麼變化。我認爲這個問題是由卡爾卡斯爾第一次設置圖像,而不是當我將它們加載到磁盤上時。 – Odrakir 2013-04-05 10:44:11

+0

你可以發佈你嘗試過的新代碼嗎? – jcesarmobile 2013-04-05 10:55:03

+0

剛發佈。 – Odrakir 2013-04-05 11:02:32