我只是想了解这一点:多线程是一种在另一个线程中触发方法的方法,因此它不会挂起主线程(当必须完成重要的事情时)。但我见过这样的东西:
主要代码如下:
[NSThread detachNewThreadSelector:@selector(createNewThread) toTarget:self withObject:nil];
这里是线程
-(void) createNewThread {
NSAutoreleasePool* p = [[NSAutoreleasePool alloc] init];
[self performSelectorOnMainThread:@selector(doSomeStuff) withObject:nil waitUntilDone:YES];
[p release];
}
我的问题是:如果线程旨在减轻主线程做某事,为什么使用performSelectorOnMainThread调用doSomeStuff?这不是疯了吗?我的意思是,你只需要在主线程上运行第二个线程,这个线程实际上你不应该使用它。
我在网上看到很多代码都是这样写的。
我知道可能是这样做的,因为它正在做一些非线程安全的事情,但这样做真的很有用吗?对我来说听起来完全没用,最好做一些像
这样的事情[self performSelector:@selector(doSomeStuff) withObject:nil afterDelay:0.01];
你觉得怎么样?
提前谢谢。
答案 0 :(得分:3)
performSelectorOnMainThread:withObject:waitUntilDone:将调用置于队列中,以便在运行循环的下一次迭代中执行。 performSelector:withObject:afterDelay:设置一个计时器来执行操作。但是,创建一个调用performSelectorOnMainThread的新线程是没有意义的,因为它将调用放在队列中,即使它已经在主线程上。
答案 1 :(得分:0)
如果那是createNewThread方法的整个主体,那么它没有任何意义。但是如果其他东西实际上发生在createNewThread中,那么可能有一个很好的理由。使用后台线程的最常见方案是performSelectorOnMainThread:如果UI需要根据后台活动进行更新。就像您正在处理大型数据集并且想要向用户显示到目前为止已经取得了多少进展一样。 UIKit不是线程安全的,因此您无法从后台线程更新UI。但是你可能会做类似的事情,让后台在循环中做很多工作,并且每次通过循环(或每5次或其他)调用回主线程来更新UI。这使得代码切换回主循环的时间足够长,以便在返回到重负荷工作的后台之前更新UI。