gpt4 book ai didi

ios - 为什么标题重复了?

转载 作者:行者123 更新时间:2023-11-29 01:26:01 25 4
gpt4 key购买 nike

我正在获取当前正在播放的歌曲,并捕获标题和艺术家,并将其存储在解析中。出于某种原因,当歌曲播放时,程序会添加 4 个左右相同的标题/艺术家。相反,我只想要一个。我该如何解决这个问题?

my objects as seen in the parse data browser

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) 向封闭类添加一个 bool 实例变量,将其命名为类似忙于保存。在方法开始时,如果 busySaving 为真,则退出,否则将其设置为真并继续。将 saveInBackground() 更改为 saveInBackgroundWithBlock() 并在完成 block 中重置 busySaving 标志。

编辑现在我们明白了为什么它会被重复调用:因为通知被重复接收。一种解决方法(上面的想法 (a))是在 getNowPlayingItem 开始时停止观察该通知 (NSNotificationCenter removeObserver)。然后,由于您希望获得后续通知,请在保存后使用 saveInBackgroundWithBlock 将自己重新添加为观察者。请注意,这不同于 saveInBackground see here for reference .

如果您愿意,上面的想法 (b) 仍然适用。

关于ios - 为什么标题重复了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34010575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com