2011-01-07 3 views
2

Я получаю идентификатор элемента мультимедиа из MPMediaPickerController. Согласно документации, это значение представляет собой объект NSNumber, содержащий uint64_t (беззнаковый длинный длинный). Я хотел бы преобразовать его в NSString для сохранения в моей модели данных. Однако, когда я конвертирую его в строку, его значение изменяется, а когда я конвертирую его обратно в число, он снова меняется! Очевидно, я не понимаю что-то об этих типах данных. Вы можете помочь?нужна помощь в преобразовании MPMediaItemPropertyPersistentID в строку и обратно

MPMediaItem *mediaPicked; 

// set mediaPicked to an MPMedia item using MPMediaPickerController... 

NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280 
NSLog(@"id as string: %@", [[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue]); // outputs 16204893883745507648 
NSLog(@"id as number: %qu", [[[mediaPicked valueForProperty:MPMediaItemPropertyPersistentID] stringValue] longLongValue]); // outputs 9223372036854775807 

Если я попытаюсь воспроизвести элемент мультимедиа перед этим преобразованием, он всегда работает. Но если я попытаюсь воспроизвести элемент мультимедиа после этого преобразования, будет работать только половина элементов мультимедиа, которые я пробовал. Поэтому некоторые значения ID выживают при конверсии, а некоторые нет.

ответ

6

Вы начинаете, говоря это:

NSLog(@"id as number: %qu", [mediaPicked valueForProperty:MPMediaItemPropertyPersistentID]); // outputs 566042331449280 

Но это не так. % qu означает «эта вещь беззнаковая длинная». Но эта вещь не unsigned long long. Это объект! Это NSNumber , обернутый вокруг unsigned long long. Вы лжете NSLog, поэтому вы получаете вывод мусора в своем первом заявлении.

Теперь попробуйте это на собственной машине:

uint64_t x = 16204893883745507648ULL; 
NSLog(@"%qu", x); 
NSNumber* n = [NSNumber numberWithUnsignedLongLong:x]; 
NSLog(@"%@", n); 
NSLog(@"%@", [n stringValue]); 

Все эти NSLog заявления дают тот же результат - потому что они все правильные формулировки, в отличие от одного вы начали. Итак, эти заявления NSLog показывают вам то, о чем вы должны говорить.

Теперь вы можете подумать: «О, отлично, поэтому я могу получить от NSNumber до NSString с stringValue в конце концов. Да, но ты не можешь вернуться. Мы не можем получить от [n stringValue] до правильного NSNumber, используя longlongValue, потому что длинный длинный длинный длинный. Нет unsignedLonglongValue. Таким образом, вы не можете добраться отсюда.

Так что же вы делаете? Не конвертируй вообще! У вас есть NSNumber, это действительно, просто сохраните его и используйте. NSNumber - это значение, которое вы можете сохранить в своей модели. (Например, он может перейти в словарь как значение или как ключ, это может быть значение в настройках пользователя по умолчанию и т. Д.)

+0

У меня было ощущение, что у меня плохо получается, но «NSNumber» вокруг долгого отсутствия без знака "отбрасывает меня. Если я изменил NSLog для использования% @ вместо% qu, то я вижу, что преобразование из исходного NSNumber в NSString с использованием stringValue в порядке. Но тогда, как вы сказали, нет сопоставимого способа преобразования NSString в NSNumber. Однако, когда моя проблема была определена лучше, я сделал еще несколько поисков и нашел альтернативу здесь: http://stackoverflow.com/questions/1181637/storing-and-retrieving-unsigned-long-long-value-to-from-nsstring , Спасибо за вашу помощь! – arlomedia

Смежные вопросы