处理耗时操作:不使用多线程
在iOS开发中,经常会遇到一些耗时操作,如果不使用多线程,将耗时操作放在主线程中,将会阻塞主线程,使得应用的UI界面阻塞。代码如下:
- (IBAction)buttonPressed {
for (NSUInteger i = 0; i < 20000; i ++) {
NSLog(@"-------%zd----", i);
}
}
当用户点击此方法关联的UIButton 后,主线程会执行一段耗时操作,图中红色按钮将处于不响应状态,textView和segmentView也无法操作,而要等待20000次打印后才能正常操作UI界面。这是我们在iOS开发中要避免的。
屏幕快照 2016-03-17 下午5.04.04.png
处理耗时操作,使用多线程
那么该如何处理上述所说的主线程阻塞问题呢?当然要用到多线程技术。苹果提供了很多多线程的解决方案:NSThread、GCD和NSOperation等。
NSThread
- 首先,新建一个方法,将耗时操作写在方法内
/** 封装耗时操作
*/
- (void)run {
for (NSUInteger i = 0; i < 50000; i ++) {
NSLog(@"-------%zd----", i);
}
}
-
当用户点击按钮时,调用NSThread方法,让run方法在后台线程运行
- (IBAction)buttonPressed { [self performSelectorInBackground:@selector(run) withObject:nil]; }
performSelectorInBackground:withObject: 这个方法可以将run方法放在后台线程中执行,第一个参数传入你想在后台执行的代码,类型为SEL,第二个参数为方法所带的参数,如果方法没有参数,则传入nil就可以了。
此时运行程序,点击按钮,将不会阻塞主线程。
-
NSThread还提供了其他的函数和方法,比如:
[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
-
NSThread还能显性创建线程,并设置线程的相关属性,比如线程名:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; thread.name = @"My Thread"; [thread start];
这个方法有一个注意点,就是需要调用thread对象的start方法。
网友评论