DispatchQueue内でNSRunLoop.Current.RunUntilを呼び出すコードが動かなくなってしまった
元々は本家Objective-Cでも使われているテクニックで、非同期処理を同期処理にするためにNSRunLoop.Current.RunUntilを使うテクニックがある。
これをDispatchQueueからDispatchAsync経由で呼び出している箇所があるのだが、
DispatchQueue.GetGlobalQueue(DispatchQueuePriority.Low).DispatchAsync(delegate { DispatchQueue.MainQueue.DispatchAsync(delegate () { UIAlertView alert = new UIAlertView(); bool dismiss = false; alert.Message = "TEST"; alert.AddButton("OK"); alert.Dismissed += delegate { dismiss = true; }; alert.Show(); while (!dismiss) { NSRunLoop.Current.RunUntil(NSDate.FromTimeIntervalSinceNow(0.5)); } }); });
※本当はもっと複雑なのだが省略するとこのようなコードになる。
最近、このコードがおかしな挙動を起こすようになってしまった。
具体的にはUIAlertViewは表示されるもののタップ操作にまったく反応しない。なので画面上の操作が全体的に無視されているような状態になる。
デバッグでNSRunLoop.Current.RunUntilの所でBreakできるのでいちおうUIスレッドは固まったりしていない模様。
原因は不明。以前に比べるとXamarin.iOSもXcodeもバージョンアップしているのでどっちに原因があるのかもよくわからない。
そもそも動作していたのが奇跡だったのだろうか。
追記 2014/02/12 12:32
解決出来た。そして"動かなくなった"のではなかった。"そもそも動いていなかった"の間違いだった。XcodeとXamarin.iOSのバージョンはまったく関係がなかった。