2011-01-18 35 views
5

Tôi lặp qua tất cả các bài hát từ thư viện nhạc của một iPhone sử dụng đoạn mã sau:NSNumber cho MPMediaItemPropertyPersistentID để NSString và ngược lại

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]; 

thứ Khá cơ bản.

Tôi nhận được PersistentID là NSString vì tôi cần ghi nó vào một tệp XML (để truyền qua mạng sang thiết bị khác). Do đó lý do tôi không thể chỉ để nó như là một NSNumber.

Thiết bị kia sau đó sẽ yêu cầu iPhone phát bản nhạc bằng cách truyền lại PersistentID trở lại.

Tại thời điểm này, iPhone có NSString của PersistentID của bản nhạc cần phát.

Thật khó để lặp lại từng bài hát một lần nữa và so sánh PersistentID cho đến khi tôi tìm bản nhạc mình muốn, vì vậy tôi đang cố sử dụng MPMediaPropertyPredicate để tìm kiếm trên iPhone.

Tôi đang sử dụng đoạn mã sau cho tìm kiếm:

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]; 

đâu persistentIDNSString từ trước đó.

Thật kỳ lạ, tính năng này hoạt động đối với một số bài hát chứ không phải cho những bài hát khác. tức là, đôi khi mảng items không trống, mặc dù tôi đang chuyển một số NSString, không phải là NSNumber.

Tôi tự hỏi nếu có cách nào để chuyển đổi số NSString của mình về số NSNumber từ đó và cách tôi có thể thực hiện điều đó.

CẬP NHẬT: Tôi đã thử các NSNumberFormatter, tôi cũng đã thử một cái gì đó như:

[NSNumber numberWithFloat:[persID floatValue]]; 

Tôi đã thử tất cả các cách tiêu chuẩn để làm việc đó mà không cần áp dụng.

Trả lời

15

Đây là hoạt động khá tốt, không có vấn đề cho đến nay:

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. 

Hope this helps bất kỳ ai khác chạy vào vấn đề này.

+0

+1 cho giải pháp. Nếu không chuyển đổi sang NSNumber tôi đã cố gắng nhập NSString vào vị từ và trả về 0 mục. hơn nửa ngày đã cố gắng gỡ lỗi. Giải pháp của bạn đã giúp. Cảm ơn. – jkr

+0

Giải pháp chuyên nghiệp. Cảm ơn! – jarryd

0

Nếu tôi hiểu chính xác bạn, bạn đang cố gắng chuyển đổi một số NSString thành NSNumber. Để thực hiện việc này, bạn có thể sử dụng NSNumberFormatter. Hãy xem phương thức numberFromString:.

NSNumberFormatter Class Reference

+0

Tôi đã chỉnh sửa câu hỏi của tôi bao gồm những gì tôi đã cố gắng. Định dạng số là một trong số đó. –

0

Tôi chỉ phải làm điều tương tự. Truy vấn Predicate cho MPMediaItemPropertyPersistentID phải được truyền vào như là NSNumber. Tôi tìm thấy câu trả lời này về việc chuyển đổi NSString thành NSNumber từ một bài đăng StackOverflow khác:

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

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

Điều này làm việc cho tôi.

0

tôi chạy vào một cái gì đó rất giống nhau và làm việc ra như sau:

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

MPMediaItem *item = query.items.firstObject; 
Các vấn đề liên quan