2011-06-07 71 views
3

我的應用程序使用iPodMusicPlayer,當用戶暫停時,用戶可能會出去更改Apple的音樂應用程序,例如創建或修改播放列表,然後返回到我的應用程序。MPMediaLibraryDidChangeNotification調用兩次?

我收到預期的MPMediaLibraryDidChangeNotification,這很好,我處理它更新我的引用等,但約2分鐘後我收到第二次MPMediaLibraryDidChangeNotification,我真的不需要。

避免第二次通知的任何想法?

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification_iPodLibraryDidChange:) name: MPMediaLibraryDidChangeNotification object:nil]; 

[[MPMediaLibrary defaultMediaLibrary] beginGeneratingLibraryChangeNotifications]; 

回答

0
if(!self.lastModifiedDate)  self.lastModifiedDate = [[NSDate alloc] init]; 
if([self.lastModifiedDate compare:[[MPMediaLibrary defaultMediaLibrary] lastModifiedDate]] == NSOrderedSame) return; 
self.lastModifiedDate = [[MPMediaLibrary defaultMediaLibrary] lastModifiedDate]; 

上述在我的通知處理程序方法中的行處理額外的調用。仍然不知道爲什麼我得到它。

+0

這不會解決它,因爲每次通知觸發它比較日期**秒**,因此,將永遠是不同的,永遠不會NSOrderedSame。 我最終維護一個計數器。如果@選擇器被調用一次,它就會增加。如果計數小於,則完成該方法。否則,它會返回;' 很髒,但它的工作原理。 – topLayoutGuide 2014-01-09 10:42:12

+0

iOS 5中的錯誤或任何與我的答案相關的錯誤都表現在具有相同lastModifiedDates的兩個通知中。沒有意識到這仍然是一個錯誤。 – amergin 2014-01-09 13:25:34

+0

好笑。在iOS 7中,它會調用三次 - 一次是播客,一次是有聲讀物,一次是音樂。所有在不同的時間。我只是想叫它一次。偶爾你應該更新你的答案? :P – topLayoutGuide 2014-01-10 07:22:03

1

你在哪裏添加他的觀察員?例如,如果添加viewWillAppear並僅刪除dealloc中的觀察者,則可能有多個觀察者導致問題。至少,當我遇到這樣的問題時,這是因爲我無意中添加了第二個觀察者而沒有刪除所有先前的觀察者。

2分鐘似乎是一個很長的滯後時間(我的幾秒鐘),但仍然值得一試。

+0

感謝Nathan的迴應。我將它添加到viewDidLoad中,並在viewDidUnload中將其刪除。 2分鐘的時間延遲似乎與iOS在Mac上與iTunes同步後發出通知所用的時間相對應,但在我的情況下,我只是在設備上進行更改。 – amergin 2011-06-08 09:14:15

0

刪除beginGeneratingLibraryChangeNotifications命令,它會修復它。 :)你只需要得到通知中心的每個通知,一個來自默認庫。

3

通知可以多次調用,具體取決於發生了什麼。例如,如果您在手機中添加了12首歌曲的專輯,該通知會被調用12次。基本上,每次庫更改時都會調用它,而不是隻在同步完成時(至少在iOS 5.1上,不確定舊的iOS版本)。

1

在多次通知後避免多次啓動更新過程的最好方法是設置一個計時器,並在執行實際更新之前等待幾秒鐘。