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

```

[![enter image description here](https://i.stack.imgur.com/VlANq.png)](https://i.stack.imgur.com/VlANq.png)