web-dev-qa-db-ja.com

-[UIApplicationデリゲート]はメインスレッドからのみ呼び出す必要があります

この警告は、Xcode 9ベータ2を使用してメインスレッドの外でデリゲートを呼び出すことができないため、深刻な問題を引き起こします。

また、メインスレッドからのみデリゲートを呼び出すことをお勧めしますよね?では、なぜこれがアプリをクラッシュさせるのでしょうか?

33
renraku

このようにメインスレッドから呼び出すだけです。

dispatch_async(dispatch_get_main_queue(), ^{
  [[UIApplication delegate] fooBar];
});

このようにアプリのデリゲートに手を伸ばすことは、アーキテクチャが少しクリーンアップを使用できることのヒントです。

任意のスレッドからデリゲートを呼び出すことができます。 UIKit呼び出しのメインスレッドにいることを確認するだけです。または、CoreDataオブジェクトが期待する正しいスレッド上にいること。それはすべて、オブジェクトのAPIコントラクトに依存します。

54
orkoden

Swiftでは、DispatchQueue.main.asyncを使用して、メインスレッドからUI制御メソッドを呼び出すこともできます。

DispatchQueue.main.async {
    YourUIControlMethod()
}
19
Allen