多线程之一

作者: 柯文李 | 来源:发表于2016-03-17 17:51 被阅读0次

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

在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方法。

相关文章

  • Java基础(多线程)

    多线程概述 多线程是Java的特点之一, 掌握多线程编程技术, 可以充分利用CPU的资源,更容易解决实际中的问题,...

  • iOS多线程操作:NSOperation

    Operation也是我们常见的多线程操作方式之一,在许多知名框架的多线程操作都是使用的Operation这种操作...

  • ArrayList与泛型类

    多线程的使用方法之一 usingSystem.Threading; Threadth=newThread(mc.T...

  • 多线程之一

    处理耗时操作:不使用多线程 在iOS开发中,经常会遇到一些耗时操作,如果不使用多线程,将耗时操作放在主线程中,将会...

  • iOS GCD多线程实现并发上传多个本地文件

    多线程编程是软件工程是必备的基础技能之一,对于iOS开发,多线程的技术有很多,有最原始的pthread,面向对象的...

  • 多线程

    线程概述 计算机同时完成多项任务的技术,就是线程技术。Java是支持多线程的语言之一,它内置了对多线程技术的支持,...

  • iOS多线程系列之一:多线程基础

    第一部分 多线程基础 一、线程的基本概念 1.多线程出现的背景 在计算机编程中,一个基本的概念就是同时对多个任务加...

  • iOS开发进阶-GCD

    什么是GCD GCD是大家现在常用的一种多线程编程技术之一,GCD用非常简洁的记述方法,实现了极为复杂繁琐的多线程...

  • pthread

    pthread pthread基本知识 实现多线程的技术方案之一. pthread是POSIX thread的简写...

  • CAS的原理

    作为多线程的基石之一,作为java.util.concurrent.*的底层方法之一,理解CAS是十分重要的。 首...

网友评论

    本文标题:多线程之一

    本文链接:https://www.haomeiwen.com/subject/ansclttx.html