質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

2589閲覧

UITableViewCell上に配置した動画のobserver管理について

ia_isier

総合スコア29

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2015/09/09 08:05

閲覧いただきありがとうございます。

表題の通り、UITableViewCell上に配置した動画のobserverの管理について質問させてください。

現在、SwiftにてUITableViewのCell内に動画を配置するアプリを開発しています。
各セル内に毎回動画を読み込む処理にすると動作が重くなってしまうため、

動画のサムネイル / AVPlayer / セルの背景

というレイヤー構造にし、
スクロールが終わったタイミングで表示されているセル内の動画を読み込んで再生する、
というフローになっています。

そこで「動画の読み込みが完了したタイミングでサムネイルを非表示にし、動画を再生する」という処理を行うために、各動画を読み込むタイミングで読み込み完了を通知するobserverを設定しました。
このobserverは読み込みが完了したタイミングで削除しています。
これである程度スムーズに動画が再生され(ているように見え)ました。

しかし、実装当初はセル数が少なかったので気づかなかったのですが、
セル数が多いと素早くスクロールした際に頻繁に落ちてしまうようになりました。

質問させていただきたいのは次の2件です。

1:落ちる原因は「セルが再利用されるタイミングでobserverが残っている」のではないかと考えています。
そこでUITableViewCellのprepareForReuse()メソッド内でobserverを削除しようとしたものの、上手く動きませんでした。
この落ちる現象を解決するにはどのような実装を行えばよいでしょうか?

2:仮に落ちる原因がセルが再利用されるタイミングにある場合、observerの追加をUITableViewControllerで行い、セルの削除をUITableViewCell内で行うことになります。
自分で実装していてなんだかあまり効率の良くない実装なのでは…と感じたのですが、この場合はobserverパターンを採用すること自体が間違っているのでしょうか…?

ご回答お待ちしています。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

例えばですが、以下みたいな感じでどうでしょうか。
自分はよく、cellの生成処理を、__configure__みたいなメソッドを作って、必要なdataを渡しているので、そのタイミングでobserverを登録します。
cellが再利用される場合もあるので、おまじないとして、addObserverする前にremoveObserverしています。(ここは__prepareForReuse()__でもいいかもしれないですね。)

後は、cellが破棄されるタイミングを__deinit__で拾ってremoveObserverを呼べば、解放済みのオブジェクトに対して通知が飛んだりして落ちることはないかと思います。

参考になれば幸いです。

Swift

1class CustomCell: UITableViewCell { 2 3 deinit { 4 NSNotificationCenter.defaultCenter().removeObserver(self) 5 } 6 7 func configure(data: AnyObject) { 8 NSNotificationCenter.defaultCenter().removeObserver(self) 9 NSNotificationCenter.defaultCenter().addObserver(self, selector: "doSomething:", name: "FooNotification", object: nil) 10 } 11 12 func doSomething(notification: NSNotification) { 13 14 } 15}

投稿2015/09/15 02:44

sgr_ksmt

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問