33

Android では、他のコードからメイン スレッドでコードを実行する方法がいくつかあります。

 1. Activity.runOnUiThread(Runnable r)
 2. new Handler.post(Runnable r);
 3. View.post

iOSの類似物は何ですか?

 dispatch_async(dispatch_get_main_queue(), ^{

    });

他の何か?

前もって感謝します。

4

2 に答える 2

52

最近の好ましい方法は、質問で引用したコードを使用してGCDを使用することです。

dispatch_async(dispatch_get_main_queue(), ^{
    // Your code to run on the main queue/thread
});

GCDよりもオブジェクト指向のアプローチを使用したい場合は、NSOperation(のようなNSBlockOperation)を使用してそれをに追加することもできます[NSOperationQueue mainQueue]

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
    // Your code to run on the main queue/thread
 }];

これはとまったく同じことをdispatch_async(dispatch_get_main_queue(), …)行い、プレーンCGCD関数よりもObjective-C/POO指向であるという利点がありNSOperationますが、オブジェクトを作成するためにメモリを割り当てる必要があるという欠点がありますが、プレーンCとGCD。


GCDを使用することをお勧めしますが、メインスレッドから特定のオブジェクトのセレクター(メソッド)を呼び出すことができる2つの方法のように、他の方法もあります。

  • - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait(NSObjectのメソッドであるため、任意のオブジェクトで呼び出すことができます)
  • に送信- (void)performSelector:(SEL)aSelector target:(id)target argument:(id)anArgument order:(NSUInteger)order modes:(NSArray *)modesします[NSRunLoop mainRunLoop]

ただし、これらのソリューションは、NSOperation既存のメソッドを呼び出すことしかできないため(したがって、オブジェクトにはすでに存在し、実行したいことを実行するメソッドが必要です)、GCDや-[NSOperationQueue addOperationWithBlock:]任意のメソッドを渡すことができるため、GCDやソリューションほど柔軟ではありません。コード(ブロックを使用)。

于 2012-10-13T17:32:07.017 に答える