最近、以前書いた iOS アプリケーションが更新時に時々クラッシュすることに突然気づきました。
コードをチェックしたところ、バグが見つかりました。バグの原因となる手順は次のとおりです:
ユーザーはテーブルビューをプルダウンして更新します。
データを保持する NSArray をクリアします。
ネットワーク データを取得し、それを NSArray に入力します。
通常の状況では、これを行うことに問題はありません。
ただし、ステップ 2 と 3 の実行中にユーザーがテーブルビューをドラッグすると、テーブルビューはすぐにクラッシュします。
その理由を分析しました。 NSArray をクリアすると、tableView は自動的にnumberOfItemsInSection を呼び出して最新のデータ数を取得しません。この時点でテーブルビューは cellForItemAtIndexPath を呼び出して新しいセルを取得します。は 0、cellForItemAtIndexPath アクセス データは配列の範囲外になります。
そこで、3 番目のステップの途中に挿入された 2 番目のステップについて説明したいと思います。つまり、リモート データを取得した後、NSArray をクリアし、新しいネットワーク データに置き換えて、reloadData のリフレッシュを調整します。
しかし、これには元のバグがまだ残っています。reloadData を呼び出す前、NSArray の数は tableView によって取得されるnumberOfItemsInSection とは異なります。ただ、以前より間隔が短くなりました。
tableView でデータをどのように更新するかを専門家に聞いてもいいですか。 100%の安全性を達成する方法。
データが変更されている限り、tableViewを更新する必要があります
コンテンツをクリアした場合でも、完了したら更新できます