多线程之一

处理耗时操作:不使用多线程

在iOS开发中,经常会遇到一些耗时操作,如果不使用多线程,将耗时操作放在主线程中,将会阻塞主线程,使得应用的UI界面阻塞。代码如下:

- (IBAction)buttonPressed {

for (NSUInteger i = 0; i < 20000; i ++) {
    NSLog(@"-------%zd----", i);
    }
}

当用户点击此方法关联的UIButton 后,主线程会执行一段耗时操作,图中红色按钮将处于不响应状态,textView和segmentView也无法操作,而要等待20000次打印后才能正常操作UI界面。这是我们在iOS开发中要避免的。


多线程之一_第1张图片
屏幕快照 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方法。

你可能感兴趣的:(多线程之一)