нужна помощь в преобразовании MPMediaItemPropertyPersistentID в строку и обратно - PullRequest
2 голосов
/ 07 января 2011

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

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

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

1 Ответ

6 голосов
/ 07 января 2011

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

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

Но это не так. % qu означает "эта штука длинная без знака". Но эта вещь не длинная без знака. Это объект! Это 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 к строке NSS с stringValue в конце концов. Да, но ты не можешь вернуться снова. Мы не можем перейти от [n stringValue] к правильному номеру NSNumber с помощью longlongValue, потому что long long - это не unsigned long long. Там нет unsignedLonglongValue. Так что вы не можете добраться отсюда.

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

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