テーブルがポップされたかどうかを知りたい場合は、クリーンアップ/保存メソッドをメソッドに入れますviewWillDisappear。タイマーを使用しているため、やりたくdeallocないので、意図しない強い参照サイクルはありません。
NSTimerあなたの質問からは明らかではありませんが、あなたが自分のUITableViewCell細胞に負担をかけていないことを確認したいと思います. 明らかに、これはモデルの問題であり、ビューの問題ではありませんが、テーブル ビューはテーブル ビュー セルのデキューと再利用のためにあらゆる種類の最適化を行います。
第二に、データを追跡する必要があるオブジェクト クラス (私はそれを と呼びますModelDataItem) は、保存するメカニズム、タイマーなどを使用するメカニズムだけでなく、保留中のレコードを強制的に保存するメカニズムも提供する必要があります (私はブール値を介して行いますneedSave)。ModelDataItemしたがって、それをサポートするには、少なくとも次の 4 つの項目が必要だと思います。
(a) 独自のタイマーへの参照。
@property (nonatomic, strong) NSTimer *timer;
(b) レコードに保留中の保存操作があるかどうかを示すフラグ
@property (nonatomic) BOOL needSave;
(c) オブジェクトの値が変更されたとき (値がインクリメントされたときなど) に呼び出して、2 秒で保存をスケジュールするメソッド:
- (void)scheduleSave
{
self.needSave = YES;
if (self.timer)
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(save)
userInfo:nil
repeats:NO];
}
(d) タイマーが呼び出して実際にレコードを保存するメソッドが必要です。
- (void)save
{
// do whatever you need to save the record
NSLog(@"%s saving value=%@", __FUNCTION__, self.value);
// now let's clean up the timer
if (self.timer)
{
[self.timer invalidate];
self.timer = nil;
}
self.needSave = NO;
}
次に、テーブル ビュー コントローラーで次のことを行う必要があります。
(a) ステッパーUIControlEventValueChangedが呼び出されたら、明らかにデータ モデルを変更してから、上記のModelDataItemメソッドを呼び出す必要がありscheduleSaveます。
(b) テーブルビューが閉じられているとき、おそらく保留中のものをすぐに保存する必要があります:
for (ModelDataItem *item in allModelDataItems)
{
if (item.needSave)
[item save];
}
dealloc最後の点で、保存が必要なモデル アイテムをクリーンアップして保存することにNSTimer依存targetしていないことに注意してくださいdealloc。そのため、手動でそれらを繰り返し処理し、ビューを閉じるときにそれを処理します。