2012-04-04 6 views
0

Я недавно разрабатывал музыкальный плеер, я пишу свои собственные сборщики. Я пытаюсь проверить свой код до предела, поэтому у меня в моем iPhone около 1600 альбомов.Кэш тысяч изображений

Я использую AQGridView для просмотра альбомов, и поскольку MPMediaItemArtwork является подклассом NSObject, вам нужно запустить метод, чтобы получить изображение из него, и этот метод масштабирует изображения.

Масштабирование для каждой ячейки использует слишком много CPU, как вы можете догадаться, поэтому мой альбом с сетчатым альбомом является лагги, несмотря на все мои усилия, связанные с ручным вождением каждой ячейки.

Итак, я подумал о начале масштабирования с помощью GCD при запуске приложения, а затем сохранил их в файл и прочитал этот файл для каждой ячейки.

Но, мой код

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{ 

    MPMediaQuery *allAlbumsQuery = [MPMediaQuery albumsQuery]; 
    NSArray *albumsArray = allAlbumsQuery.collections; 

    for (MPMediaItemCollection *collection in albumsArray) { 

     @autoreleasepool { 
     MPMediaItem *currentItem = [collection representativeItem]; 
     MPMediaItemArtwork *artwork = [currentItem valueForProperty:MPMediaItemPropertyArtwork]; 
     UIImage *artworkImage = [artwork imageWithSize:CGSizeMake(90, 90)]; 

     if (artworkImage) [toBeCached addObject:artworkImage]; 
     else [toBeCached addObject:blackImage]; 

     NSLog(@"%@", [currentItem valueForProperty:MPMediaItemPropertyAlbumTitle]); 
     artworkImage = nil; 
     } 
    } 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:albumsArray] forKey:@"covers"]; 
    }); 
    NSLog(@"finished saving, sir"); 
}); 

в прикладных AppDelegate в: didFinishLaunchingWithOptions: метод делает мой крах приложения, без консоли входа и т.д.

Это, кажется, проблемы с памятью, поэтому многие изображения сохраняются в NSArray, который хранится в ОЗУ до тех пор, пока не сохранит, что iOS-сила закрывает мое приложение.

Есть ли у вас какие-либо предложения по поводу того, что делать?

Приветствия

+0

Посмотрите на карту памяти с NSData. –

+0

Можете ли вы открыть это немного? –

ответ

2

Посмотрите на недавно выпущенный SYCache, который сочетает в себе NSCache и кэширование на диске. Вероятно, это плохая идея перейти в состояние предупреждения о памяти, как только вы запустите приложение, но это лучше, чем принудительное закрытие.

Что касается вышеприведенного комментатора, отображаемые данные - это метод (с использованием mmap или его эквивалента) для загрузки данных с диска, как если бы все было в памяти одновременно, что могло бы помочь с загрузкой UIImage позже в будущем. Обратное (с NSMutableData) также верно, что файл можно записать так, как если бы он находился непосредственно в ОЗУ. В качестве метода это может быть полезно.

 Смежные вопросы

  • Нет связанных вопросов^_^