0
//viewcontroller.m

-(void)viewdidLoad
{
   self.theOneViewController= [[TheOneViewController alloc]init];
  [contentsView addSubview:self.theOneViewController.view];
}


//theOneViewController

- (void)viewDidLoad
{          .
           .
           .
       //UI WORK
           .
           .
    //LONG WORK  
[self performSelectorOnMainThread:@selector(initAppList) withObject:nil waitUntilDone:NO]; 

}

このコードでは、LONGWORKが終了する前に表示UIWORKを表示します。これで、スレッド効果を得ることができます。

//viewcontroller.m

-(void) buttonPressed:(id)sender    -> event method
{
 self.theOneViewController= [[TheOneViewController alloc]init];
 [contentsView addSubview:self.theOneViewController.view];
}

 //theOneViewController
 - (void)viewDidLoad
 {         .
           .
           .
      //UI WORK
           .
           .
  //LONG WORK 
  [self performSelectorOnMainThread:@selector(initAppList) withObject:nil waitUntilDone:NO]; 
 }

このコードでは、LONGWORKが終了した後に表示UIWORKを表示します。だから私はスレッド効果を持つことができません。なぜ?そして、(performSelectorOnMainThread withObject:waitUntilDone :)の代わりに(performSelectorInBackground:withObject:)を使用します。しかし、これはスレッドを使用しない場合よりも遅くなります。

イベントメソッド呼び出しでスレッド効果を持たせたい。良い方法はありますか?お願い助けて!

4

2 に答える 2

0

あなたの質問は特に明確ではありませんが、答えてみます。

またはメソッドperformSelectorOnMainThread:withObject:waitUntilDone:から呼び出しています。これに関する問題は、すべての UI 処理 ( 、UI イベントなど) がメイン スレッドで行われることです。つまり、呼び出しは、メイン スレッドの runloop でメソッドをキューに入れるだけです。これはおそらく、呼び出し元のメソッドが完了した直後にメソッドが実行されることを意味します。viewDidLoadbuttonPressedviewDidLoadperformSelectorOnMainThread

最終的には、メソッドを直接呼び出すよりも、メイン スレッドがどちらの方法を実行してもほぼ同じ時間がかかるため、これを行ってもあまり効果がありません。

呼び出しは別のスレッドでメソッドperformSelectorOnBackgroundThread:withObject:を実行しinitAppList、メイン スレッドが引き続き UI を処理できるようにします。ただし、お気づきのように、バックグラウンド スレッドを作成するオーバーヘッドがあるため、全体的に少し遅くなる可能性があります。

于 2012-04-22T09:25:03.433 に答える
0

まず、viewDidLoadメインスレッドでのみ呼び出されるため、呼び出す必要はありませんperformSelectorOnMainThread:

次に、バックグラウンドで時間のかかる作業を行う予定がある場合は、明示的なスレッドの前にGCDを試してください。

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0),^ {
    // long work
});
于 2012-04-22T09:25:16.497 に答える