SVProgressHUD は
// インジケーター表示 [SVProgressHUD showWithStatus:@"Sending..."]; // 終了 [SVProgressHUD dismiss];
というコードで簡単にカッコいいインジケーターを表示できて重宝してる。
ただ、普段インジケーターを閉じるのに dismiss を使っていると
- 編集ページでインジケーターを表示して非同期に保存
- 保存に成功したらインジケーターを閉じて一覧ページに戻る
- 一覧ページでインジケーターを表示して非同期にデータを取得
- データの取得に成功したらインジケーターを閉じる
みたいな処理のとき、2 でインジケーターを閉じると 3 のインジケーターが表示されない、 という現象に遭遇することがある。 デバッガで追ってみると、どうやら 1 → 3 → 2 の順で呼ばれてしまっていた。
厳密には、dismiss が現在表示しているインジケーターを問答無用で閉じてしまうため、 3 で表示したインジケーターが即閉じられてしまっていた、というわけ。
そんなときは dismiss の代わりに popActivity を使うと解決できる。
// インジケーター表示 [SVProgressHUD showWithStatus:@"Sending..."]; // インジケータが不要になったら呼び出す [SVProgressHUD popActivity];
SVProgressHUD は内部でカウンタを保持していて、 show や showWithStatus でインジケーターを表示すると1増える。 popActivity を呼び出すとカウンタが 1 減る。 そして、カウンタが 0 になるとインジケーターが閉じられる。
popActivity でも閉じることができるから、 普段から dismiss ではなく popActivity を使って閉じるようにしたほうが良さそうだ。