MPMediaQuery для возврата только локальных элементов

Я хочу отображать UITableView только с песнями, которые в данный момент находятся на устройстве.

Если я запрашиваю все элементы, я (очевидно) получаю все элементы, включая тот, который я купил, но не загрузил. Вот (часть) кода

@property (strong, nonatomic) NSMutableArray *songsList;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    MPMediaQuery *everything = [[MPMediaQuery alloc] init];
    NSArray *itemsFromGenericQuery = [everything items];
    self.songsList = [NSMutableArray arrayWithArray:itemsFromGenericQuery];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.songsList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"TableCellID";
    TableCellTitle *tablecell = (TableCellTitle *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
MPMediaItem *song = [self.songsList objectAtIndex:indexPath.row];

    NSString *songTitle = [song valueForProperty: MPMediaItemPropertyTitle];
    tablecell.cellSongname.text = songTitle;

    return tablecell;
}

Я читал пару вещей о вовлечении

[song valueForProperty:MPMediaItemPropertyIsCloudItem]

но не могу заставить его работать, как я объяснил выше. Какие-либо предложения?


person ASCJU    schedule 18.10.2013    source источник
comment
У меня была аналогичная проблема. Приложение Apple Music отфильтровывает все песни, которых нет на устройстве, когда у вас отключен интернет, и я не думаю, что это имеет какое-либо отношение к MPMediaItemPropertyIsCloudItem. Это свойство будет захватывать только те песни, которые вы вручную загрузили из облака, тогда как приложение «Музыка» может определить, какие песни были загружены в кеш, независимо от того, были ли они загружены вручную или пользователь только что прослушал их один раз. . Я тоже хочу найти решение этой проблемы.   -  person sooper    schedule 18.10.2013
comment
Или вы просто пытаетесь восстановить песни, загруженные из облака?   -  person sooper    schedule 18.10.2013
comment
Похоже, мы ищем одно и то же... ;)   -  person ASCJU    schedule 18.10.2013


Ответы (2)


Я решил это сам, добавив следующую строку в метод viewDidLoad между MPMediaQuery... и NSArray...

[everything addFilterPredicate:[MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithBool:NO] forProperty:MPMediaItemPropertyIsCloudItem]];
person ASCJU    schedule 21.10.2013

Инициализируйте MPMediaQuery таким образом в методе ViewDidLoad.

MPMediaQuery * everything = [MPMediaQuery songsQuery];
self.songsList = [everything items];
[self.tableView reloadData];

и метод ячейки для индекса

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

    static NSString *cellIdentifier = @"TableCellID";
    TableCellTitle *tablecell = (TableCellTitle *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    MPMediaItem *anItem = (MPMediaItem *)[self.songsList objectAtIndex: indexPath.row];

    if([anItem valueForProperty:MPMediaItemPropertyTitle]) {
       tablecell.cellSongname.text = [anItem valueForProperty:MPMediaItemPropertyTitle];

    }

    return tablecell;

}
person Surya Subenthiran    schedule 18.10.2013
comment
Это по-прежнему дает тот же результат - все (локальные и облачные песни) - person ASCJU; 18.10.2013