2015-12-01 65 views
0

我正在播放當前正在播放的歌曲,並抓取標題和藝術家,並將其存儲在解析中。由於某些原因,當歌曲播放時,節目增加了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) 
         } 
        }) 
       } 
      }) 
     } 
    } 
} 
+0

您必須將它添加到Parse才能在解析中出現,我看到您有一個循環。所以它可能發生在那裏。但是,你決定的地方 - 如果沒有添加到Parse或YES不添加它,是否有這個對象是問題發生的地方。 – DogCoffee

+0

循環只是檢索數據庫中的標題,並將其與當前正在播放的歌曲進行比較,如果當前正在播放的歌曲在該數組中找到,那麼它將不會被添加,如果它不會被添加。 – tman0542

回答

1

從證據看,有一個很好的機會,功能getNowPlayingItem被稱爲幾次迅速。它啓動查詢,在保存任何內容之前完成一些查詢。那些查詢完成(沒有保存完成)啓動一些保存,你會得到一些對象。

通過在方法的開始處打印消息並在saveInBackground之前打印消息來關注控制檯上的時間戳。如果我是對的,修復很簡單:(a)找出爲什麼該方法被調用了很多次並修復了這個問題,或者(b)向封閉類中添加一個布爾實例變量,稱之爲像busySaving。在方法開始時,如果busySaving爲真,則保釋出來,否則將其設置爲真。將您的saveInBackground()更改爲saveInBackgroundWithBlock()並重置完成塊中的busySaving標誌。

編輯 現在我們看到爲什麼它被重複調用:因爲通知正在被重複接收。解決方法之一(上面的想法(a))將停止在getNowPlayingItem開始處觀察該通知(NSNotificationCenter removeObserver)。然後,由於您想要獲取後續通知,請在保存後重新添加爲觀察者,並使用saveInBackgroundWithBlock。請注意,這與saveInBackgroundsee here for reference不同。

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

+0

我的情緒正好。該方法本身不顯示保存4次的跡象。 @ tman0542你應該檢查你的代碼中的其他地方。 –

+0

我編輯了我的代碼,以包含函數被調用的地方。在調用方法之前,我仍然不知道'saveInBackground'是什麼意思。 – tman0542

+0

@danh,你是對的,該方法被多次調用,我該如何解決? http://puu.sh/lF6RV/21d18dca6b.png – tman0542