completionHandler とか、usingBlock とか・・・

またまたハマりましたね。今回ハマったのは、MapKIt で reverse location しようとした話。

reverse location は reverseGeocodeLocation ってのでできるんだけど、この method は非同期な訳だ。なので、完了すると completionHandler 部分が実行されると。

それはそういうものとして受け容れることにして、非同期ながら処理が完了したら、_detaiItem に addRecord して、tableView を更新したい訳だ。こういう処理はどうするんだ?というのを自分なりに調べてみたら、NSNotificationCenter に通知して処理を行うのが theory とのことで、素直な自分としてはやってみた訳だ。addObserverForName ってのが用意されていて、notification center に通知する代わりに、実行するブロックを指定することもできるので、その方が手間少なくていいやと思ってやってみたら、ブロックが呼ばれない。

なんで呼ばれないのだ?理由は、completionHandler 内なので、ブロックが呼ばれないのだろうと想像。そりゃそうだよね。で、どうしたかというと、単純に処理を completionHandler の中に書いたらうまくいった。収穫としては、completionHandler の前で使っていた変数を copletionHandler 内で使用しても特に矛盾なく、うまく処理できたと。

block とか、completionHandler とかを Objective-C で書くと、インデントからして凄い見辛くなるのね。こういうのは Swift で書くと、見た目はすっきりして良さそうなんだけど、本質的にできるようになることが増える訳ではないので、やっぱり Objective-C で書いてしまうなぁ。