5

次のコードを使用して、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];

かなり基本的なもの。

NSStringPersistentID をXML ファイルに書き込む必要があるため (ネットワーク経由で別のデバイスに送信するため) 、PersistentID を取得しています。したがって、そのままにしておくことができない理由NSNumberです。

他のデバイスは、PersistentID を再度送信することで、iPhone にトラックを再生するよう要求します。

この時点で、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を渡しているにもかかわらず、配列が空でない場合があります。NSStringNSNumber

NSString背中を元の背中に変換する方法と、それを行う方法があるかどうか疑問に思ってNSNumberいます.

更新:私は NSNumberFormatter を試しましたが、次のようなものも試しました:

[NSNumber numberWithFloat:[persID floatValue]];

私は勝つことなくそれを行うすべての標準的な方法を試しました。

4

4 に答える 4

15

これはかなりうまく機能しており、これまでのところ問題はありません。

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.

これが、この問題に遭遇した他の人の助けになることを願っています。

于 2011-01-18T21:56:03.933 に答える
0

私があなたを正しく理解していれば、あなたは を に変換しようとしていNSStringますNSNumber。これを行うには、を使用できますNSNumberFormatternumberFromString:メソッドを見てみましょう。

NSNumberFormatter クラス リファレンス

于 2011-01-18T18:09:06.603 に答える
0

私はちょうど同じことをしなければなりませんでした。MPMediaItemPropertyPersistentID のクエリ述語は、NSNumber として渡す必要があります。別の StackOverflow 投稿から NSString を NSNumber に変換する際に、この回答を見つけました。

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

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

これは私にとってはうまくいきました。

于 2011-09-21T18:08:22.550 に答える