AVPlayer在播放前停止UIActivityIndi​​cator

问题描述:

我试图在AVPlayer开始播放音乐时停止activityIndi​​cator,并且在AVPlayer再次启动时(加载,缓冲)启动activityIndi​​cator。这一点起作用,问题在于播放音乐之前,AVPlayer在几秒钟之前停止activityIndi​​cator(5,6,7)。当它再次(加载,缓冲)时,它不会再次启动activityIndi​​cator。任何人都知道我的错误在哪里,或者我需要修复它。由于AVPlayer在播放前停止UIActivityIndi​​cator

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 
     } 
    } 
} 

}

输出

AVPlayer开始后(5,6,7秒)玩这一行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

那么在你的代码中,无论何时按下一个单元格,你都有activityView.stopAnimating()。所以无论如何,要么动画将开始或停止点击,这取决于if sender.selected == false

所以我认为如果你删除activityView.stopAnimating()那么它不会停止这么早的动画。阅读你的问题和代码是很难的,因为我不确定输出是从哪里来的。

+0

第一次当我按播放按钮只是该代码执行'如果sender.selected == false {............}''audioControlButtonAction'按钮? – ZAFAR007

关于第二个问题,即“并且还没有再次启动activityIndi​​cator当它再次(加载,缓冲)”

我觉得应该是一个解决办法可能是下列之一: -

一)

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){ 
    print("You selected cell #\(indexPath.item)!") 
//Start activityView Animation when user clicks on any item which won't be buffered by default 
activityView.startAnimating() 
} 

b)

var selectIndex:Int = -1 { 
didSet { 
     //Start activityView Animation when user clicks on any item which won't be buffered by default 
     activityView.startAnimating() 
     } 
} 
+0

不,我的意思是第一次显示activityIndi​​cator也会在播放音乐时停止activityIndi​​cator,但当下一次需要缓存或再次加载时,由于互联网连接速度缓慢或由于其他原因而无法启动“startAnimating”。 – ZAFAR007

+0

我认为问题出现在'observeValueForKeyPath'中,因为它总是进入'AVPlayerStatus.ReadyToPlay'或'default:'? – ZAFAR007

+0

也许我不太确定,添加断点并查看执行情况如何确认问题是否出现在observerValueForKeyPath或其他位置。另外,如果由于连接速度较慢,还包括可用性检查连接可用性 – MShah