I'm trying to stop activityIndicator when AVPlayer start playing music, and also start activityIndicator when again AVPlayer start (loading, buffering). It little bit works, the problem is that AVPlayer stop activityIndicator before some seconds (5,6,7) before playing music. And also it not start again activityIndicator when it again (loading, buffering). Any one have any idea where is my mistake or what i need to fix it. Thanks
var activityView = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge) var selectIndex:Int = -1 var check = true var url : String! var playerItem:AVPlayerItem? var player:AVPlayer? func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{ let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! RadioCollectionViewCell cell.backgroundColor = UIColor.yellowColor() let object = objects[indexPath.row] cell.img.image = UIImage(named: object["image"]!) cell.btnPlay.addTarget(self, action: Selector("audioControlButtonAction:"), forControlEvents: UIControlEvents.TouchUpInside) cell.btnPlay.tag = indexPath.row+1 return cell } func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){ print("You selected cell #\(indexPath.item)!") } func audioControlButtonAction(sender: UIButton){ if check == false { deallocObservers(player!) } var btn:NSInteger btn = sender.tag as NSInteger let object = objects[btn-1] let nurl = NSURL(string: "\(object["url"]!)")! playerItem = AVPlayerItem(URL: nurl) player=AVPlayer(playerItem: playerItem!) print(selectIndex) if selectIndex != -1 && selectIndex != sender.tag { let bt:UIButton = self.view.viewWithTag(selectIndex) as! UIButton if bt.selected == true { bt.selected = false } } if sender.selected == false{ player!.addObserver(self, forKeyPath: "status", options:NSKeyValueObservingOptions(), context: nil) player!.addObserver(self, forKeyPath: "playbackBufferEmpty", options:NSKeyValueObservingOptions(), context: nil) player!.addObserver(self, forKeyPath: "playbackLikelyToKeepUp", options:NSKeyValueObservingOptions(), context: nil) player!.addObserver(self, forKeyPath: "playbackBufferFull", options:NSKeyValueObservingOptions(), context: nil) player!.addObserver(self, forKeyPath: "loadedTimeRanges", options: NSKeyValueObservingOptions(), context: nil) player!.play() sender.selected = true check = false selectIndex = sender.tag activityView.startAnimating() } else{ activityView.stopAnimating() check = true player?.pause() sender.selected = false selectIndex = -1 } print(selectIndex) } func deallocObservers(player: AVPlayer) { player.removeObserver(self, forKeyPath: "status") player.removeObserver(self, forKeyPath: "playbackBufferEmpty") player.removeObserver(self, forKeyPath: "playbackLikelyToKeepUp") player.removeObserver(self, forKeyPath: "loadedTimeRanges") player.removeObserver(self, forKeyPath: "playbackBufferFull") } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>){ if object?.isEqual(player) == true && keyPath == "status" { print(player?.status) switch player!.status { case AVPlayerStatus.Failed: print("Player item status failed") player?.play() break case AVPlayerStatus.ReadyToPlay: print("Player item status is ready to play") activityView.stopAnimating() break case AVPlayerStatus.Unknown: print("player item status is unknown") break } switch keyPath! { case "playbackBufferFull": activityView.stopAnimating() print("playbackBufferFull") break case "playbackLikelyToKeepUp": activityView.stopAnimating() print("playbackLikelyToKeepUp") break case "playbackBufferEmpty": activityView.startAnimating() print("playbackBufferEmpty") break case "loadedTimeRanges": print("loadedTimeRanges") default: print("Error") break } } }
}
Output
AVPlayer start playing after(5,6,7 seconds) this line Player item status is ready to play
-1 1 Optional(__C.AVPlayerStatus) Player item status is ready to play Error 1 -1 -1 1 Optional(__C.AVPlayerStatus) Player item status is ready to play Error