2016-12-17 3 views
3

私はラジオストリーミングアプリを素早くビルドしています。現在はすべて動作していますが、ユーザーエクスペリエンスを少し改善したいと考えています。AVPlayerがいつ再生してコントローラに情報を送信するかを知る方法

ラジオの操作を処理するRadioPlayer.swiftクラスがあります。

import Foundation 
import AVFoundation 

class RadioPlayer { 
static let sharedInstance = RadioPlayer() 
private var player = AVPlayer(URL: NSURL(string:"http://rfcmedia.streamguys1.com/classicrock.mp3")!) 

private var isPlaying = false 


func play() { 
    player = AVPlayer(URL: NSURL(string: "http://rfcmedia.streamguys1.com/classicrock.mp3")!) 
    player.play() 
    isPlaying = true 

    player.currentItem?.status 

} 

func pause() { 
    player.pause() 
    isPlaying = false 
    player.replaceCurrentItemWithPlayerItem(nil) 
} 

func toggle() { 
    if isPlaying == true { 
     pause() 
    } else { 
     play() 
    } 
} 

func currentlyPlaying() -> Bool { 
    return isPlaying 
} 

次に、私はそのクラスを実装するView Controllerを持っています。私の目的は、プレイヤーがロードされているときに、ストリーミングが準備中であることを知らせるメッセージを送信することです。

私の質問は、それを達成する方法です。アンドロイドでは、メッセージを送信するためにブロードキャストを使用しましたが、迅速に同等のものを見つけられませんでした。

答えて

1

AVPlayerプロパティのオブザーバーを追加することができます。

player.addObserver(self, forKeyPath: "reasonForWaitingToPlay", options: .new, context: &observerContext) 

それともスウィフト2で、.Newを使用します:スウィフト3で

player.addObserver(self, forKeyPath: "reasonForWaitingToPlay", options: .New, context: &observerContext) 

注意を、そのコンテキストを識別するために私有財産を使用します:

private var observerContext = 0 

そして、あなたは追加することができますオブザーバー法。スウィフト3では:

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    guard context == &observerContext else { 
     super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
     return 
    } 

    // look at `change![.newKey]` to see what the status is, e.g. 

    if keyPath == "reasonForWaitingToPlay" { 
     NSLog("\(keyPath): \(change![.newKey])") 
    } 
} 

それともスウィフト2:

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { 
    guard context == &observerContext else { 
     super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) 
     return 
    } 

    // look at `change![NSKeyValueChangeNewKey]` to see what the status is, e.g. 

    if keyPath == "reasonForWaitingToPlay" { 
     NSLog("\(keyPath): \(change![NSKeyValueChangeNewKey])") 
    } 

} 
+0

ので、私はRadioPlayerクラスにオブザーバーを実装する必要があり、私のViewControllerにFUNC?おかげで多く – user3515652

+0

うん。技術的には、あなたのビューコントローラに 'AVPlayer'プロパティを直接観察させることができますが、' RadioPlayer'がキーイベントの 'ViewController'に通知できる独自のデリゲートプロトコルパターンやクロージャパターンを持つ方が適切ですコントローラが気にするかもしれない。 – Rob

+1

はい、あなたが投稿したコードを実装しようとしています。終了すると答えを受け入れるでしょう:D – user3515652

関連する問題