2011-06-07 69 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

在多次通知后避免多次启动更新过程的最好方法是设置一个计时器,并在执行实际更新之前等待几秒钟。