2014-08-27 51 views
1

我是Objective C和iOS編程的新手,並且已經進入了一些超出我的頭腦的水域。任何幫助表示讚賞。使用多個對象集合中的第一個項目創建對象數組?

我有一個問題,排序在UITableView中使用的數組。基本上,我想查詢一組相冊,並根據用戶設置按字母順序或按日期(升序和降序)進行排序。首先,我綜合了一些全局數組,並mediaquery專輯:

@synthesize allSongs, arrayForTableView; 
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery]; 
[songsQuery setGroupingType: MPMediaGroupingAlbum]; 
arrayForTableView = [songsQuery collections]; 
allSongs = [songsQuery items]; 

到目前爲止,一切都很好。相冊按照字母順序排序。 allSongs數組用於別的一些播放功能。所以,現在,我在檢測的設置,以及添加排序由「年」屬性:

@synthesize allSongs, arrayForTableView; 
MPMediaQuery *songsQuery = [MPMediaQuery songsQuery]; 
[songsQuery setGroupingType: MPMediaGroupingAlbum]; 
NSArray *allAlbums = [songsQuery collections]; 
allSongs = [songsQuery items]; 

if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"SortAlbumsMethod"] isEqualToString:@"0"]) { 
    arrayForTableView = [songsQuery collections]; 
} else if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"SortAlbumsMethod"] isEqualToString:@"1"]) { 
    NSSortDescriptor *sortDescriptor; 
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year" 
               ascending:YES]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    arrayForTableView = [allAlbums sortedArrayUsingDescriptors:sortDescriptors]; 
} else { 
    NSSortDescriptor *sortDescriptor; 
    sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"year" 
               ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
    arrayForTableView = [allAlbums sortedArrayUsingDescriptors:sortDescriptors]; 
} 

這是我遇到的問題。以上不起作用,因爲每個集合(專輯)沒有年份屬性。如果我將「allAlbums」替換爲「allSongs」,則代碼正常運行。 除了,我現在每個歌都有一個條目。顯示的標籤信息僅與專輯相關,並且導航基於AlbumPersistentID,所以一切都很好,我只是有太多重複的條目(顯示完全相同,因爲歌曲名稱未顯示)。

看起來很明顯的解決方案就是創建一個數組,讓我們用「allAlbums」中的每個集合中的單個項目稱之爲「albumRepresentatives」,然後在排序描述符中使用它。每個項目實際上是一首歌而不是一張專輯,但外觀和功能仍然有效。理想情況下,我想比較每張專輯中的所有歌曲,選擇具有最高「年」屬性的歌曲並將其添加到「專輯代表」中。 B計劃將簡單地在索引0處爲每個專輯收集歌曲。

問題是,這是超出我的能力在這一點上。任何幫助將不勝感激!

回答

0

一個選項可能是使用set,因爲它們不存儲重複的對象並將其初始化爲數組的內容。您可能需要重寫(可能添加到類別)isEqual來實現它。

第二個選項:

//Could be added as category to MPMediaItem for example 
+(MPMediaItem*)latestSongInAlbum:(NSArray*)songsInAlbum 
    MPMediaItem *latestSong = nil; 
    for (MPMediaItem *song in songsInAlbum) { 
    if(!latestSong) { 
     latestSong = song; 
    } else if([[latestSong valueForProperty: MPMediaItemPropertyReleaseDate] compare: 
     [song valueForProperty: MPMediaItemPropertyReleaseDate]] == NSOrderedAscending]) { 
    latestSong = song; 
    } 
    } 
return latestSong; 
} 

不是做類似這樣的事僞代碼:

NSMutableArray* latestSongFromeachAlbum = [[NSMutableArray alloc] initWithCapacity:[allAlbums count]]; 
for(album in allAlbums) { 
NSIndexSet* indexes = [allSongs indexesOfObjectsPassingTest:(^)(id obj, NSUInteger idx, BOOL *stop)) { 
     return album == obj.album; 
}]; 
NSArray* songsInAlbum = [allSongs objectsAtIndexes:indexes]; 

MPMediaItem* latestSong = [ExtendedClass latestSongInAlbum:songsInAlbum]; 

//now you have pair latestSong(you can use it's date) in album and the album. You can store as you prefer 
[latestSongFromeachAlbum addObject:latestSong]; 
} 

希望這是不夠完整的。

+0

謝謝。我最初嘗試了一套,但它不起作用,因爲來自同一專輯的多首歌曲不是真正的重複。它們看起來是因爲顯示的屬性在它們之間是共同的。你的第二個選項似乎有點凌駕於我的頭上,但我會開始玩這個。當它們被返回時,是否有可能將每個「最新歌曲」添加到可變數組中?因爲那個數組就是我所需要的。感謝幫助! – 2014-08-27 13:24:05

+0

當然,你可以根據自己的喜好使用它:)。我個人會爲此功能創建一個函數並從中返回數組。 – tsr 2014-08-28 07:49:19