-performSelector:withObject:afterDelay:を用いて、複数のアニメーションを実行するときの注意点

今回ははまった。

なので共有として書いておく


以下のようなコードを書いていた

[self performSelector:@selector(animate1) withObject:nil afterDelay:0.5f];
[self animate2];
[self performSelector:@selector(animate3) withObject:nil afterDelay:0.5f];


animate1~3は内部でUIViewのアニメーションを実行するメソッドが書かれており、durationは全て0.5fである。


これを書いたとき、以下のようにアニメーションされる事を期待した。

  1. animate2が実行される
  2. animate2の終了直後、”同時に”animate1とanimate3が実行される


だが、実際は以下のように動作した。

  1. animate2が実行される
  2. . animate1が実行される
  3. 2.からほんの少しだけ遅れてanimate3が実行される

[self animate2]の実行により、内部の時計が少しだけ進んでしまった事に依るanimate3の遅延だと考えられる。

今回はいくつかのファイルにまたがってこのような記述を行ったため、completion^()を使うのをさけてしまった。
出来るだけcompletionを使う実装を心がけたい。