我正在获取当前正在播放的歌曲,捕获标题和艺术家,并将其存储在解析中。由于某种原因,当歌曲播放时,程序会添加 4 首左右相同的标题/艺术家。相反,我只想要一个。我该如何解决?
在解析数据浏览器中看到的我的对象 https://i.stack.imgur.com/tsCOw.png
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated);
NSNotificationCenter.defaultCenter().addObserver(self, selector: "getNowPlayingItem", name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification, object: nil)
musicPlayer.beginGeneratingPlaybackNotifications()
}
func getNowPlayingItem() {
NSNotificationCenter.defaultCenter().removeObserver(self)
if let nowPlaying = musicPlayer.nowPlayingItem {
let title = nowPlaying[MPMediaItemPropertyTitle] as? String
let artisttest = nowPlaying[MPMediaItemPropertyTitle]
if let artist = nowPlaying[MPMediaItemPropertyArtist] as? String{
let objectPointer = PFObject(className: "Pointer")
let object = PFObject(className: "MasterSongs")
let query = PFQuery(className: "Pointer")
query.findObjectsInBackgroundWithBlock({
(objects: [AnyObject]?, error: NSError?) -> Void in
var objectIDs = objects as! [PFObject]
for i in 0...objectIDs.count-1{
self.Parsearray.append((objectIDs[i].valueForKey("title") as? String)!)
// print(self.Parsearray)
}
if self.Parsearray.contains(title!){
print("already in db")
}else{
objectPointer["title"] = title
objectPointer["user"] = PFUser.currentUser()
objectPointer["artist"] = artist
objectPointer.saveInBackgroundWithBlock({ (success: Bool, error: NSError?) -> Void in
if(error != nil){
print(error)
}else{
NSNotificationCenter.defaultCenter().addObserver(self, selector: "getNowPlayingItem", name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification, object: nil)
}
})
}
})
}else{
let objectPointer = PFObject(className: "Pointer")
let query = PFQuery(className: "Pointer")
query.findObjectsInBackgroundWithBlock({
(objects: [AnyObject]?, error: NSError?) -> Void in
var objectIDs = objects as! [PFObject]
for i in 0...objectIDs.count-1{
self.Parsearray.append((objectIDs[i].valueForKey("title") as? String)!)
// print(self.Parsearray)
}
if self.Parsearray.contains(title!){
print("already in db")
}else{
objectPointer["title"] = title
objectPointer["user"] = PFUser.currentUser()
objectPointer["artist"] = "No artist found :("
objectPointer.saveInBackgroundWithBlock({ (success: Bool, error: NSError?) -> Void in
if(error != nil){
print(error)
}else{
NSNotificationCenter.defaultCenter().addObserver(self, selector: "getNowPlayingItem", name: MPMusicPlayerControllerNowPlayingItemDidChangeNotification, object: nil)
}
})
}
})
}
}
}
从证据来看,该函数很有可能getNowPlayingItem
被快速调用了几次。它会启动查询,其中一些查询会在保存任何内容之前完成。这些查询完成(尚未完成保存)会启动一些保存,并且您会获得一些对象。
通过在方法开始处和之前打印一条消息来检查这一点saveInBackground
注意控制台上的时间戳。
如果我是对的,修复很简单:(a)找出为什么该方法被多次调用并修复它,或者(b)向封闭类添加一个布尔实例变量,将其命名为类似busySaving
。在方法开始时,如果出现以下情况则退出busySaving
为 true,否则将其设置为 true 并继续。改变你的saveInBackground()
to saveInBackgroundWithBlock()
并重置busySaving
完成块中的标志。
EDIT现在我们明白为什么它被重复调用:因为通知被重复接收。修复(上面的想法(a))的一种方法是在开始时停止观察该通知(NSNotificationCenter removeObserver)getNowPlayingItem
。然后,由于您想获得后续通知,请在保存后重新将自己添加为观察者,使用saveInBackgroundWithBlock
。请注意,这与saveInBackground
请参阅此处以供参考 https://parse.com/docs/ios/api/Classes/PFObject.html#//api/name/saveInBackgroundWithBlock:.
如果您愿意,上面的想法 (b) 仍然适用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)