NSNumber для MPMediaItemPropertyPersistentID в NSString и обратно

Я просматриваю все песни из музыкальной библиотеки 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]];

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


person Tom Irving    schedule 18.01.2011    source источник


Ответы (4)


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

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.

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

person Tom Irving    schedule 18.01.2011
comment
+1 за решение. Без преобразования в NSNumber я попытался ввести NSString для предиката и вернуть 0 элементов. больше полдня ушло на отладку. Ваше решение помогло. Спасибо. - person jkr; 07.11.2011

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

Справочник по классу NSNumberFormatter

person Dylan Copeland    schedule 18.01.2011
comment
Я редактирую свой вопрос, чтобы включить то, что я пробовал. Форматировщик чисел был одним из них. - person Tom Irving; 18.01.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];

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

person John G    schedule 21.09.2011

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

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

MPMediaItem *item = query.items.firstObject;
person Ja͢ck    schedule 08.01.2015