テーブルがポップされたかどうかを知りたい場合は、クリーンアップ/保存メソッドをメソッドに入れます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
。そのため、手動でそれらを繰り返し処理し、ビューを閉じるときにそれを処理します。