iOS多线程开发——NSThread浅析

  在iOS开发中,多线程的实现方式主要有三种,NSThread、NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用。案例代码上传至 https://github.com/chenyufeng1991/NSThread。

(1)初始化并启动一个线程

  - (void)viewWillAppear:(BOOL)animated
  {
  [super viewWillAppear:animated];
  //获取当前线程
  NSThread *current = [NSThread currentThread];
  NSLog(@"当前线程为 %@",current);
  //初始化线程
  NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
  //设置线程的优先级(0.0-1.0)
  thread.threadPriority = 1.0;
  thread.name = @"新线程1";
  [thread start];
  }
  - (void)run
  {
  NSLog(@"线程执行");
  //获取当前线程
  NSThread *current = [NSThread currentThread];
  NSLog(@"当前线程为 %@",current);
  //线程休眠,可以模拟耗时操作
  [NSThread sleepForTimeInterval:2];
  //获取主线程
  NSThread *mainThread = [NSThread mainThread];
  NSLog(@"子线程中获得主线程 %@",mainThread);
  }

  其中currentThread,这个方法很有用,常常可以用来判断某方法的执行是在哪个线程中。

  (2)NSThread可以指定让某个线程在后台执行:


  //后台创建一个线程来执行任务,需要在调用的方法中使用自动释放池

  [self performSelectorInBackground:@selector(run3) withObject:nil];
  - (void)run3

  {

  @autoreleasepool {

  NSLog(@"主线程3:%@,当前线程3:%@",[NSThread mainThread],[NSThread currentThread]);

  }

  }

(3)子线程执行耗时操作,主线程更新UI。这是多线程开发中最常用的案例。子线程中调用performSelectorOnMainThread方法用来更新主线程。

//测试在子线程中调用主线程更新UI
- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];

 NSThread *subThread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
 //NSThread可以控制线程开始
 [subThread start];
}

- (void)run
{
 NSLog(@"主线程1:%@,当前线程1:%@",[NSThread mainThread],[NSThread currentThread]);
 //以下方法需要在子线程中调用
 [self performSelectorOnMainThread:@selector(invocationMainThread) withObject:nil waitUntilDone:YES];
}

- (void)invocationMainThread
{
 NSLog(@"主线程2:%@,当前线程2:%@",[NSThread mainThread],[NSThread currentThread]);
 NSLog(@"调用主线程更新UI");
}

  (4)同样,我们也可以新建一个子线程的类,继承自NSThread. 然后重写里面的main方法,main方法就是该线程启动时会执行的方法。

@implementation MyThread

- (void)main
{
 NSLog(@"main方法执行");
}

@end

  然后按正常的创建启动即可。线程就会自动去执行main方法。

//可以自己写一个子类,继承自NSThread,需要重写main方法
/**
 * 执行的代码是在main中的,而不是使用@selector.
 使用main方法,线程中执行的方法是属于对象本身的,这样可以在任何其他需要使用这个线程方法的地方使用,而不用再一次实现某个方法。

 而其他的直接NSThread的创建线程,线程内执行的方法都是在当前的类文件里面的。
 */
- (void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];

 MyThread *thread = [[MyThread alloc] init];
 [thread start];
}

  (5)NSThread中还有一个很常用的方法就是延迟。延迟2s执行。

 //线程休眠,可以模拟耗时操作
 [NSThread sleepForTimeInterval:2];

对于多线程的三种实现方式,我们都要能够熟练使用

(0)

相关推荐

  • 实例解析iOS应用多线程开发中NSthread类的用法

    一.NSthread的初始化 1.动态方法 复制代码 代码如下: - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;  // 初始化线程  NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  // 设置线程的优先级(0.0 - 1.0,1.0最高级)  thre

  • IOS多线程编程NSThread的使用方法

    IOS多线程编程NSThread的使用方法 NSThread是多线程的一种,有两种方法创建子线程 (1)优点:NSThread 比GCD.NSOperation都轻量级 (2)缺点:需要自己管理线程的生命周期,线程同步.线程同步对数据的加锁会有一定的系统开销 第一种是隐藏创建,有以下几种方式: (1)多用于串行:- (id)performSelector:(SEL)aSelector withObject:(id)object; (2)后台执行,多用于并行:- (void)performSele

  • 详解iOS多线程之2.NSThread的加锁@synchronized

    那什么时候需要加锁呢,就是当多条线程同时操作一个变量时,就需要加锁了. 上代码 声明变量 @interface ViewController () @property (strong, nonatomic)NSThread *thread1; @property (strong, nonatomic)NSThread *thread2; @property (strong, nonatomic)NSThread *thread3; @property (assign, nonatomic)int

  • iOS多线程开发——NSThread浅析

    在iOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,为了学习的完整性,今天我们主要从代码层面来实现NSThread的使用.案例代码上传至 https://github.com/chenyufeng1991/NSThread. (1)初始化并启动一个线程 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated

  • IOS多线程开发之线程的状态

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种状况可以从两个角度出发:对于单核处理器,可以将多个步骤放到不同的线程,这样一来用户完成UI操作后其他后续任务在其他线程中,当CPU空闲时会继续执行,而此时对于用户而言可以继续进行其他操作:对于多核处理器,如果用户在UI线程中完成某个操作之后,其他后续操作在别的线程中继续

  • IOS 多线程GCD详解

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. #definedispatch_get_main_queue() \DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q) 可以看出,dispatch_get_main_queue也是一种disp

  • iOS多线程介绍

    一.前言部分 最近在面试,重新温习了一遍多线程,希望加深一遍对于多线程的理解. 1.什么是进程? 1).要了解线程我们必须先了解进程,通俗来讲进程就是在系统中运行的一个应用程序. 2).每个线程之间是独立存在的,分别运行在其专用的且受保护的内存空间中. 3).比如打开QQ或Xcode系统会分别开启两个进程 如图: 4).我们可以通过"活动监视器"查看Mac系统中所开启的进程. 2.什么是线程? 1).一个进程要想执行任务必须得有线程,即一个进程至少要有一个线程. 2).线程是进程的基本

  • iOS多线程实现多图下载功能

    本文实例为大家分享了iOS多线程实现多图下载功能的具体代码,供大家参考,具体内容如下 一.模型文件代码如下 // XMGAPP.h #import <Foundation/Foundation.h> @interface XMGAPP : NSObject /** APP的名称 */ @property (nonatomic, strong) NSString *name; /** APP的图片的url地址 */ @property (nonatomic, strong) NSString *

  • IOS  多线程GCD详解

    Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. #definedispatch_get_main_queue() \DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q) 可以看出,dispatch_get_main_queue也是一种disp

  • iOS Swift开发之日历插件开发示例

    本文介绍了iOS Swift开发之日历插件开发示例,分享给大家,具体如下: 效果图 0x01 如何获取目前日期 关于日期,苹果给出了 Date 类,初始化一个 Date 类 let date = Date() 打印出来就是当前系统的日期和时间 那么如何单独获得当前年份,月份呢? var date: [Int] = [] let calendar: Calendar = Calendar(identifier: .gregorian) var comps: DateComponents = Dat

  • iOS程序开发之使用PlaceholderImageView实现优雅的图片加载效果

    说明 1. PlaceHolderImageView基于SDWebImage编写 2. 给定一个图片的urlString,以及一个placeholderImage就可以优雅的显示图片加载效果 效果 源码 PlaceholderImageView.h/.m // // PlaceholderImageView.h // SDWebImageViewPlaceHorder // // Created by YouXianMing on 16/9/14. // Copyright © 2016年 Yo

  • IOS游戏开发之五子棋OC版

    先上效果图 - 功能展示 - 初高级棋盘切换效果 实现思路及主要代码详解 1.绘制棋盘 利用Quartz2D绘制棋盘.代码如下 - (void)drawBackground:(CGSize)size{ self.gridWidth = (size.width - 2 * kBoardSpace) / self.gridCount; //1.开启图像上下文 UIGraphicsBeginImageContext(size); //2.获取上下文 CGContextRef ctx = UIGraph

随机推荐