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]; 

}

这段代码,在 LONG WORK 结束之前查看显示 UI WORK。所以我可以有一个线程效果。

//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]; 
 }

在此代码中,在 LONG WORK 结束后查看显示 UI WORK。所以我不能有线程效果。为什么?我使用 (performSelectorInBackground:withObject:) 而不是 (performSelectorOnMainThread withObject:waitUntilDone:) 。但这比不使用线程要慢。

我想在事件方法调用中产生线程效果。有什么好办法吗?请帮帮我!

4

2 回答 2

0

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

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

最终,与直接调用方法相比,您并没有真正获得太多收益,因为主线程将花费大约相同的时间来完成任何一种方式。

调用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 回答