-1

나는 사용자의 음악 라이브러리에있는 재생 목록 목록을 보여주는 tableView입니다. 나는이 목록을 가져 오는 데 사용되는 코드는 다음과 같습니다 그때가모든 tableView 셀은 재생 목록에 대한 동일한 앨범 사진 이미지를 표시합니다.

@implementation playlistsViewController 
{ 
    NSArray *playlists; 
    MPMediaQuery *playlistsQuery; 
} 

- (void)viewDidLoad 
{   
    self.title = @"Playlists"; 

    playlistsQuery = [MPMediaQuery playlistsQuery]; 
    playlists = [playlistsQuery collections]; 
} 

#pragma mark - Table view data source 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [playlists count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ .... 

    // Configure the cell... 

    MPMediaItem *rowItem = [playlists objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [rowItem valueForProperty: MPMediaPlaylistPropertyName]; 

    cell.imageView.image = [self getAlbumArtworkWithSize:(CGSizeMake(44,44))]; 

    return cell; 
} 

getAlbumArtworkWithSize : 재생 목록에있는 모든 노래를 통해 사이클이 앨범 노래를 찾을 때까지이 코드가 무엇을

- (UIImage *) getAlbumArtworkWithSize: (CGSize) albumSize 
{ 
    // IMAGE 

    MPMediaQuery *playlistQuery = [MPMediaQuery playlistsQuery]; 
    MPMediaPropertyPredicate *playlistPredicate = [MPMediaPropertyPredicate predicateWithValue: playlistTitle forProperty: MPMediaPlaylistPropertyName]; 
    [playlistQuery addFilterPredicate:playlistPredicate]; 

    for (MPMediaPlaylist *playlist in playlists) { 
     NSLog (@"%@", [playlist valueForProperty: MPMediaPlaylistPropertyName]); 

     NSArray *songs = [playlist items]; 

     for (int i = 0; i < [songs count]; i++) { 

      MPMediaItem *mediaItem = [songs objectAtIndex:i]; 
      UIImage *artworkImage; 

      MPMediaItemArtwork *artwork = [mediaItem valueForProperty: MPMediaItemPropertyArtwork]; 
      tempImage = [artwork imageWithSize: CGSizeMake (1, 1)]; 

      if (tempImage) { 
       tempImage = [artwork imageWithSize:albumSize]; 
       playlistImage = artworkImage; 
       return artworkImage; 
      } 
     } 
    } 
return [UIImage imageNamed:@"Songs.png"]; 
} 

일부 곡은 삽화가 없으므로 삽화를 사용하십시오. 그런 다음 이미지를 반환합니다.

그러나 이것은 단지 내 테이블에 에 대해 동일한 아트 워크 이미지가 모든 세포를 반환합니다. 각 테이블보기 셀 (재생 목록 이름)에 getAlbumArtworkWithSize을 어떻게 실행합니까?

내가 현재 무엇을 얻을 수 있습니다 :

This is what I currently get IMAGE http://i58.tinypic.com/29lxmjs.jpg.

답변

0

getAlbumArtworkWithSize 메서드에서 해당 행에 속한 재생 목록과 관련된 항목 모음을 반복하지 않기 때문입니다. 쉽게하고 실행 시간 (당신의 방법에 추가 쿼리를 만드는되지 않음)를 줄이기 위해 함수에 컬렉션을 전달하려고 :

- (UIImage *)getAlbumArtworkWithSize:(CGSize)albumSize forPlaylist:(MPMediaItemCollection *)collection 
{ 
    for (MPMediaItem *mediaItem in collection.items) { 
     UIImage *artworkImage; 

     MPMediaItemArtwork *artwork = [mediaItem valueForProperty: MPMediaItemPropertyArtwork]; 
     tempImage = [artwork imageWithSize: CGSizeMake (1, 1)]; 

     if (tempImage) { 
      tempImage = [artwork imageWithSize:albumSize]; 
      playlistImage = artworkImage; 
      return artworkImage; 
     } 
    } 
    return [UIImage imageNamed:@"Songs.png"]; 
} 

을 다음과 같이 사용 :

cell.imageView.image = [self getAlbumArtworkWithSize:CGSizeMake(44,44) forCollection:[playlists objectAtIndex:indexPath.row]]; 

을 나는 '같으면 이 방법을 사용하는 것이 좋습니다. ~ 1000 개의 항목이 포함 된 재생 목록에서 매우 느릴 수 있습니다. 컬렉션의 대표 항목을 사용하고 이미지가 반환되지 않으면 자리 표시자를 사용하는 것이 좋습니다. 어떤 것이 좋을지 :

- (UIImage *)getAlbumArtworkWithSize:(CGSize)albumSize forPlaylist:(MPMediaItemCollection *)collection 
{ 
     UIImage *artworkImage; 

     MPMediaItem *mediaItem = [collection representativeItem]; 
     MPMediaItemArtwork *artwork = [mediaItem valueForProperty: MPMediaItemPropertyArtwork]; 
     tempImage = [artwork imageWithSize: CGSizeMake (1, 1)]; 

     if (tempImage) { 
      tempImage = [artwork imageWithSize:albumSize]; 
      playlistImage = artworkImage; 
      return artworkImage; 
     } 
    return [UIImage imageNamed:@"Songs.png"]; 
} 
+0

감사합니다. 앨범 아트가있는 첫 번째 노래를 찾는 것이면 원래의 방법이 더 큰 재생 목록으로 인해 느려지는 이유는 무엇입니까? 분명히 재생 목록의 처음 10 개 안에있는 노래에는 하나가 있습니다. 그냥 궁금 해서요 :) 또한 두 번째로 더 효율적인 방법을 사용했는데 앨범 아트가있는 노래를 사용 했음에도 불구하고 모든 재생 목록에 대한 대표 이미지를 반환하지 않습니다. 예 : 가장 많이 플레이 한 상위 25 위 - 앨범 아트 워크가있는 재생 목록에도 불구하고 [내 앱] (http://i62.tinypic.com/15mk6rc.jpg) ([music app] (http://i62.tinypic.com/2zfny1y.png 참조))). – user3127576

관련 문제