2017-05-12 3 views
0
私は楽しんでる-IOS-SDKを使用してアプリケーションを研究開発をしてい

は、私は正常に楽しんでるに私のアプリを接続していると音声が再生されているが、問題がある:私は私のPlaySongViewControllerを閉じると、私のアプリがクラッシュになりますiOS: "SPAudioStreamingControllerのインスタンスが既に使用されています。"

"An instance of SPAudioStreamingController is already in use." 

私は

var spotifyPlayer: SPTAudioStreamingController? 

@IBAction func closeView(_ sender: UIButton) { 
    print("close view") 
    self.dismiss(animated: true, completion: nil) 
    self.spotifyPlayer?.logout() 
    invalidateTimers() 
} 

func audioStreamingDidLogout(_ audioStreaming: SPTAudioStreamingController!) { 
    print("after logout") 
    try! self.spotifyPlayer?.stop() 
} 

をログアウトした後、私はこのコードで私のspotifyPlayerを停止しない限り、問題は、このコードが正しく

 self.spotifyPlayer = SPTAudioStreamingController.sharedInstance() 
     self.spotifyPlayer!.playbackDelegate = self 
     self.spotifyPlayer!.delegate = self 
     try! spotifyPlayer?.start(withClientId: auth.clientID) 

     self.spotifyPlayer!.login(withAccessToken: authSession.accessToken) 
012を作業する前に、私は直接私のViewControllerを閉じると続けています私は再び私PlaySongViewControllerを開くために別の曲を選ぶとき

は、私がPlaySongViewControllerを開いたとき、それは「楽しんでるが表示されます、私は非プレミアムアカウントでログインしようとすると、別の問題がある

"An instance of SPAudioStreamingController is already in use." 

でクラッシュしますPlaySongViewControllerを閉じて他のPlaySongViewControllerを開いて別の曲を再生すると、「既に使用中です」というエラーが表示されて再びクラッシュします。

私のspotifyPlayerを起動したらこのコードを無視できますか?

try! spotifyPlayer?.start(withClientId: auth.clientID) 

または解決策はありますか?

答えて

3

まあ、私はここで見ています二つのものがあります:あなたはスタート署名のための完全な署名を見れば

try! spotifyPlayer?.start(withClientId: auth.clientID) 

docatchする必要があり、それはエラーをスローしますと述べています。代わりにできるときにエラーを捕まえるようにしてください。

do { 
    try self.spotifyPlayer?.start(withClientId: auth.clientID) 
    } catch { 
    print("Failed to start with clientId") 
    } 

try代わりhandle errorsを強制しないことが重要です。

コードのブロックを実行することによって、エラーを処理するdo-catchステートメントを使用します。 do節のコードによってエラーがスローされた場合は、 がcatch句と照合され、どちらがエラーを処理できるかを判断します。 SPTAudioStreamingController.sharedInstance()にさらに

player?.loggedInあなたがloginを呼び出そうとする前にチェックするために、このメソッドを使用することができ、私はシングルトンの中で、この例を入れているされdocatch前にチェックする価値ある財産でありますloginの方法。

/** Returns `YES` if the receiver is logged into the Spotify service, otherwise `NO`. */ 
open var loggedIn: Bool { get } 

第二に、あなたがそうあなたが同じspotifyPlayerを使用しようと、複数のビューコントローラで終わるとstartを呼び出さないと、そのビュー・コントローラ・インタフェースの音楽を再生するすべてのロジックを処理するためにsingletonを作成したほうが良いかもしれませんそれが必要でないときに。

class MusicPlayer: { 
    static let shared = MusicPlayer() 
    fileprivate let player = SPTAudioStreamingController.sharedInstance() 

    override init() { 
    player?.playbackDelegate = self 
    player?.delegate = self 
    } 

    func login() { 
    if player?.loggedIn { return } 
    do { 
     try self.spotifyPlayer?.start(withClientId: auth.clientID) 
    } catch { 
     print("Failed to start with clientId") 
    } 
    } 
} 

となり、ビューコントローラのリンクでMusicPlayer.sharedにリンクされます。

+0

私はまだMusixmatchのようなアプリを作っていますが、PlaySongViewControllerで歌詞を処理する必要がある場合は、私のMusicPlayerクラスで歌詞を処理できますか?とにかく、私がMusicPlayerにプレーヤーデリゲートを置く場合、私は、audioLinkingdidLogin funcなどを、私のView ControllerではなくMusicPlayerクラスに置く必要がありますか? –

+0

したくない場合は、シングルトンを使用する必要はありません。 doブロックとcatchブロックはそれだけで十分なはずです。しかし、はい、あなたの質問に代理人のメソッドは、音楽プレーヤーになるだろう。あなたのコーヒーが現在どのように構成されていて、歌詞がどのように表示されるかを詳細に調べることができません。 –

+0

はい、doとcatch lyricはうまく動く、私は試してみることを試みる?それはnullを与えることができるので、それは正常に動作し、2番目の、私は今シングルトンを使用しないと思う。本当に助けていただきありがとうございます。 –

関連する問題