SVProgressHUDでインジケーターを閉じるときの注意

SVProgressHUD は

// インジケーター表示
[SVProgressHUD showWithStatus:@"Sending..."];

// 終了
[SVProgressHUD dismiss];

というコードで簡単にカッコいいインジケーターを表示できて重宝してる。

ただ、普段インジケーターを閉じるのに dismiss を使っていると

  1. 編集ページでインジケーターを表示して非同期に保存
  2. 保存に成功したらインジケーターを閉じて一覧ページに戻る
  3. 一覧ページでインジケーターを表示して非同期にデータを取得
  4. データの取得に成功したらインジケーターを閉じる

みたいな処理のとき、2 でインジケーターを閉じると 3 のインジケーターが表示されない、 という現象に遭遇することがある。 デバッガで追ってみると、どうやら 1 → 3 → 2 の順で呼ばれてしまっていた。

厳密には、dismiss が現在表示しているインジケーターを問答無用で閉じてしまうため、 3 で表示したインジケーターが即閉じられてしまっていた、というわけ。

そんなときは dismiss の代わりに popActivity を使うと解決できる。

// インジケーター表示
[SVProgressHUD showWithStatus:@"Sending..."];

// インジケータが不要になったら呼び出す
[SVProgressHUD popActivity];

SVProgressHUD は内部でカウンタを保持していて、 show や showWithStatus でインジケーターを表示すると1増える。 popActivity を呼び出すとカウンタが 1 減る。 そして、カウンタが 0 になるとインジケーターが閉じられる。

popActivity でも閉じることができるから、 普段から dismiss ではなく popActivity を使って閉じるようにしたほうが良さそうだ。