2011-01-18 6 views
5

मैं निम्नलिखित कोड का उपयोग कर के माध्यम से एक iPhone के संगीत पुस्तकालय से सभी गाने पाशन कर रहा हूँ:MPMediaItemPropertyPersistentID के लिए NSString करने के लिए NSNumber और फिर से वापस

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 के रूप में नहीं छोड़ सकता।

अन्य डिवाइस फिर आईफोन के लिए PersistentID को फिर से प्रेषित करके ट्रैक चलाने के लिए कहेंगे।

इस बिंदु पर, आईफोन के पास ट्रैक के PersistentID के NSString है जो इसे खेलना चाहिए।

यह फिर से हर गीत के माध्यम से लूप करने के लिए संगत होगा और जब तक मुझे इच्छित ट्रैक नहीं मिल जाता है तब तक PersistentIDs की तुलना करें, इसलिए मैं अपने लिए आईफोन खोज करने के लिए MPMediaPropertyPredicate का उपयोग करने की कोशिश कर रहा हूं।

मैं खोज के लिए निम्नलिखित कोड का उपयोग कर रहा:

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 पर परिवर्तित करने का कोई तरीका है, और यह मैं कैसे कर सकता हूं।

अद्यतन:

[NSNumber numberWithFloat:[persID floatValue]]; 

मैं बिना प्रबल कर के सभी मानक तरीके की कोशिश की है: मैं NSNumberFormatter की कोशिश की है, मैं भी तरह कुछ कोशिश की है।

उत्तर

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. 

आशा इस किसी और ने इस समस्या में पड़ गए मदद करता है।

+0

+1। NSNumber में कनवर्ट किए बिना मैंने 0 आइटम की भविष्यवाणी करने और वापस करने के लिए एनएसएसटींग इनपुट करने की कोशिश की। आधा दिन डेबग करने की कोशिश कर रहा है। आपके समाधान में मदद मिली। धन्यवाद। – jkr

+0

प्रो समाधान। धन्यवाद! – jarryd

0

यदि मैं आपको सही ढंग से समझता हूं, तो आप NSString को NSNumber में परिवर्तित करने का प्रयास कर रहे हैं। ऐसा करने के लिए, आप NSNumberFormatter का उपयोग कर सकते हैं। numberFromString: विधि पर एक नज़र डालें।

NSNumberFormatter Class Reference

+0

मैं मेरे सवाल का संपादन किया है शामिल करने के लिए मैं क्या कोशिश की है। संख्या स्वरूपक उनमें से एक था। समाधान के लिए –

0

मुझे बस वही करना था। MPMediaItemPropertyPersistentID के लिए क्वेरी पूर्वानुमान एनएसएनंबर के रूप में पारित किया जाना है। मैं एक StackOverflow पद से NSNumber के लिए NSString परिवर्तित करने पर यह जवाब मिला:

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

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

यह मेरे लिए काम किया।

0

मैं बहुत कुछ इसी तरह में पड़ गए और बाहर काम किया है:

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

MPMediaItem *item = query.items.firstObject;