2016-05-11 23 views
0

この質問はおそらく他のものと似ていますが、私はそうではないと思います。UITableViewCell/UICollectionViewCellのコンテキスト

は簡単に行く...

は、それが最善の方法は、一般的なベストプラクティスでのUITableViewCell/UICollectionViewCellサブクラスに不透明なコンテキストオブジェクト(void *型/ ID/ANYOBJECT)を設定し、あなたのためですか?

なぜこの質問がありますか? UITableView/UICollectionViewは非同期で構築されていることが分かりますが、これはクラッシュや間違ったデータの使用を避けるための良い解決策と考えることができます。

私を説明しましょう。 おそらく、大多数のiOS開発者は、セル自体の何らかの対話に反応するためにセルを渡すために使用されたデリゲートオブジェクトを使用して、UITableViewCellをサブクラス化する必要が少なくとも1回発生しました。

デリゲート(ViewController)はおそらく、セルのインデックスパスを検索して、関連するデータオブジェクトを発見し、そのデータでいくつかの処理を行います。大丈夫だが、テーブルビューがリモートデータ更新のために再ロードされたが非同期プロセスであるためにデリゲートメッセージが配信されてしまうことが多く発生する...

最悪の場合、クラッシュする最良の場合、間違ったデータオブジェクトを処理します。

したがって、これまでのように、デリゲートメッセージに送信されたセルからコンテキストを取り戻すセルデリゲートが使用できるセルサブクラスによって保持された不透明なオブジェクト(コンテキスト)を解決することができます。明らかに、再利用のために、prepareForReuse中にセルクラスをコンテキストからクリーンアップする必要があります。

TableViewCell モデルについてはは分かりませんが、デリゲートの郵便配達員として機能します。

あなたはどう思いますか?

答えて

0

が、のtableViewが原因リモートデータ更新にリロードされた後、デリゲートのメッセージが配信されることが起こる多くの時間が、非同期プロセス古い細胞が画面

に残っているされているあなたは「shouldn次の場合にこの問題を解決してください:

  • デリゲートメッセージは、メインキューで同期して送信されます。
  • モデルキューとテーブルビューの更新は、メインキューで同期して処理されます。

モデルの更新とテーブルの再読み込みの間に時間差がある場合は、説明するだけでなく、多くの問題が発生します。

本質的には、セルに追加されたコンテキストオブジェクトに対して、索引のパスなどを調べる方法を好みます。

+0

もちろん、デリゲートへのメッセージはメインスレッドで同期して送信されます。私が説明したのは、TableViewがリモートから更新されている場合にのみ見ることができます...実際のライブアップデートについて考えてみましょう。 – Gabriele

+0

TableViewのリロードが一度行われると、すべてのデータソースメッセージが同じ実行ループで送信されるわけではありません。これがフレームワークの構築方法です。このため、reloadDataが発生し、現在の古いセルのユーザー対話は、reloadDataの後のフレームワークによって送信されます。これは間違いの原因ではなく、フレームワークがこのように動作するために発生します。 – Gabriele

関連する問題