在viewDidLoad()和eventmethod()中调用performSelectorOnMainThread()有什么区别?(ios)

在viewDidLoad()和eventmethod()中调用performSelectorOnMainThread()有什么区别?(ios),ios,multithreading,performselector,Ios,Multithreading,Performselector,} 这段代码,查看显示UI的工作,不久工作就结束了。这样我就可以有线程效果了 //viewcontroller.m -(void)viewdidLoad { self.theOneViewController= [[TheOneViewController alloc]init]; [contentsView addSubview:self.theOneViewController.view]; } //theOneViewController - (void)viewDidL

}

这段代码,查看显示UI的工作,不久工作就结束了。这样我就可以有线程效果了

//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]; 
在这段代码中,长时间工作结束后查看显示UI工作。 所以我不能有线程效应。为什么? 我使用(performSelectorInBackground:withObject:)而不是(performSelectorOnMainThreadWithObject:waitUntilDone:)。但这比不使用线程要慢

我希望在事件方法调用中具有线程效果。
有好办法吗?请帮帮我

你的问题不是特别清楚,但我会试着回答

您正在从
viewDidLoad
按钮按下的方法调用
performSelectorOnMainThread:withObject:waitUntilDone:
。问题是所有UI处理(
viewDidLoad
,UI事件等)都是在主线程上完成的,这意味着调用
performselectornmainthread
只会在主线程runloop上将方法排队。这可能意味着该方法将在调用方法完成后立即运行

最终,通过直接调用方法来完成这项工作并不能获得太多的收益,因为主线程在这两种方法中所花费的时间大致相同


调用
performSelectorOnBackgroundThread:withObject:
将在单独的线程上运行
initAppList
方法,允许主线程继续处理UI。但是,正如您所注意到的,总体来说,这可能会稍微慢一点,因为有创建后台线程的开销。

首先,
viewdiload
将仅在主线程上调用,因此您不必调用
performselectornmainthread:

第二,若你们计划在后台做一些耗时的工作,那个么在任何显式线程之前尝试一下

//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]; 
 }
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0),^ {
    // long work
});