在viewDidLoad()和eventmethod()中调用performSelectorOnMainThread()有什么区别?(ios)
} 这段代码,查看显示UI的工作,不久工作就结束了。这样我就可以有线程效果了在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
//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
});