2016-06-14 1 views
2

私はSwift 1に戻ってきましたが、私はSwift 2.2に移行しようとしていました。それはすべて、(最終的に)オブザーバーと関係する気まぐれなクラッシュから離れて機能します。Swift 2.2でAVPlayerがクラッシュするのを避けてください。

func removeObservers() 
{ 
    print("REMOVING OBSERVERS") 
    if (!self.is_image && self.player != nil ) { 
     if (self.player?.observationInfo != nil) { 

      self.player?.removeObserver(self, forKeyPath: "currentItem.status") 
      self.player?.removeObserver(self, forKeyPath: "readyForDisplay") 

     } 
    } 
    NSNotificationCenter.defaultCenter().removeObserver(self) 

} 

これはオブザーバをSwiftTryCatchを使用しますがある場所がクラッシュの行で「『readyForDisplayキーのパスのためのオブザーバーを削除することはできません『』それはオブザーバーとして登録されていないために。』」ORことで以前働いていました私がコメントアウトすると、割り当て解除されたオブジェクトに登録されます。

do {} catch {}を追加すると、「これはスローされません」というエラーが表示され、同じものがクラッシュします。これをtry-catch形式の形式にするにはどうすればよいですか?

+0

の財産です。コードの他の部分でそのオブザーバーを削除しますか?最も簡単な方法は、オブザーバーを作成したり削除したりする場所を統一することです。私はreadyForDisplayを表示後に削除していましたが、deallocが来たときに削除できませんでした。 – Putz1103

答えて

5

、LIBSは、プログラマが(ないスローを行うたが、ちょうどあなたのアプリをクラッシュ)を防止することができたというエラーに対して、本当に予想外でのエラー(スロー)についてうるさく厳しいました。

(私は、この区別のファンではありません。少なくとも、Appleがどのカテゴリにどのようなエラーがあるかについての具体的な決定のすべてではありません。)JSON APIは、この部門の無意味な点に照準を合わせています。私たちが持っているAPI)

NSKeyValueObservingドキュメントは言う:。

オブジェクトがオブザーバーとして登録されていない場合removeObserver:forKeyPath:をコールするとエラーになりますが。このような状況で

「それは誤りであるが、」アップルのコードである「あなたはこれをやったことがないために責任がある、とあなたがしなければ、あなたのアプリがキャッチできない方法でクラッシュします。」

があり、通常、あなたがしようとしていることの正当性をチェックするためのAPI呼び出しです。しかし、私の知る限り、何のKVO APIはありませんが、「Xは、オブジェクトZのキーパスYを観察していますか?」、あなたが依頼することができます呼び出して次の3つのオプションがあり意味し:削除しようとしている理由

  • 図アウト観察していないものからオブザーバを削除し、プログラム自身の内部ロジックを使用しないようにします。
  • "私が観察しているプレーヤー"に弱いインスタンス変数を保存し、オブザーバーを削除しようとする前に一致するかどうかを確認します。
  • 自分をオブザーバとして追加してから削除してください。 (私は冗長なアドオンがOKであることを確信している。)
+0

私はオブザーバーが設定されていると言うブール値を追加しようとしましたが、いくつかのケースで2回削除されて固定されていることが分かりました。ありがとう。 – Martin

-1

メソッドの最後にremoveObserver(self)を呼び出しているので、上記のコードをコメント解除できないのはなぜですか? removeObserver(self)は、登録されている場合はすべてのオブザーバーを削除するためです。これがあなたの問題を解決することを願っています。スウィフト2では

NSNotificationCenter.defaultCenter().removeObserver(self) 
+0

KVO通知はNSNotificationCenterを経由しますか?私はこれが動作するかどうかはわかりません。もしそうなら、うれしい! –

0

statusAVPlayerまたはAVPlayerItemのいずれかのプロパティです。

readyForDisplayは、私はこれに非常によく似た問題を抱えていたAVPlayerLayer

関連する問題