NSNumber для MPMediaItemPropertyPersistentID для NSString и обратно - PullRequest
5 голосов
/ 18 января 2011

Я перебираю все песни из музыкальной библиотеки iPhone, используя следующий код:

NSArray * songs = [[NSArray alloc] initWithArray:[[MPMediaQuery songsQuery] collections]];

for (MPMediaItemCollection * item in songs){

    NSString * persistentID = [[[item representativeItem] valueForProperty:MPMediaItemPropertyPersistentID] stringValue];
    // Do something with it.
}

[songs release];

Довольно простые вещи.

Я получаю PersistentID как NSString потому что мне нужно записать его в файл XML (для передачи по сети на другое устройство).Следовательно, причина, по которой я не могу просто оставить его как NSNumber.

. Затем другое устройство попросит iPhone воспроизвести трек, снова передавая PersistentID.

При этому iPhone есть NSString из PersistentID трека, который он должен воспроизвести.

Было бы излишним циклически повторять каждую песню и сравнивать PersistentID, пока я не найду нужный трек, так что япытаюсь использовать MPMediaPropertyPredicate для поиска iPhone.

Я использую следующий код для поиска:

MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:persistentID forProperty:MPMediaItemPropertyPersistentID];

MPMediaQuery * songsQuery = [[MPMediaQuery alloc] init];
[songsQuery addFilterPredicate:predicate];

if ([[songsQuery items] count]){

    MPMediaItem * item = [[songsQuery items] objectAtIndex:0];
    // Play item.
}

[songsQuery release];

Где persistentID - это NSStringиз ранее.

Странно, это работает для некоторых песен, а не для других.т. е. иногда массив items не пуст, хотя я передаю NSString, а не NSNumber.

Мне интересно, есть ли способ конвертировать NSString обратно?на NSNumber он пришел и как я могу это сделать.

ОБНОВЛЕНИЕ : я пробовал NSNumberFormatter, я тоже пробовал что-то вроде:

[NSNumber numberWithFloat:[persID floatValue]];

Я испробовал все стандартные способы сделать это без преобладания.

Ответы [ 4 ]

15 голосов
/ 19 января 2011

Это работает довольно хорошо, никаких проблем пока нет:

unsigned long long ullvalue = strtoull([persistentID UTF8String], NULL, 0);
NSNumber * numberID = [[NSNumber alloc] initWithUnsignedLongLong:ullvalue];

MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:numberID forProperty:MPMediaItemPropertyPersistentID];
[numberID release];

// And so on.

Надеюсь, это поможет любому, кто столкнулся с этой проблемой.

0 голосов
/ 08 января 2015

Я столкнулся с чем-то очень похожим и выработал следующее:

NSNumber *musicIdentifier = [[[NSNumberFormatter alloc] init] numberFromString: persistentID];
MPMediaQuery *query = [[MPMediaQuery alloc] initWithFilterPredicates:[NSSet setWithObject:[MPMediaPropertyPredicate predicateWithValue:musicIdentifier forProperty:MPMediaItemPropertyPersistentID]]];

MPMediaItem *item = query.items.firstObject;
0 голосов
/ 21 сентября 2011

Я просто должен был сделать то же самое.Предикат запроса для MPMediaItemPropertyPersistentID должен быть передан как NSNumber.Я нашел этот ответ при преобразовании NSString в NSNumber из другого поста StackOverflow:

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * persistentIDasNumber = [f numberFromString:persistantID];
[f release];

MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate   predicateWithValue:persistentIDasNumber  forProperty:MPMediaItemPropertyPersistentID];

Это сработало для меня.

0 голосов
/ 18 января 2011

Если я правильно вас понимаю, вы пытаетесь преобразовать NSString в NSNumber.Для этого вы можете использовать NSNumberFormatter.Взгляните на метод numberFromString:.

Ссылка на класс NSNumberFormatter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...