iOS进阶之多线程

摘要:
//第一个参数是线程指针//第二个参数线程的一些属性//第三个参数函数指针用于执行该方法//第四个参数线程传递值pthread_Create(它的意义是执行耗时的任务。NSThread创建方法:@selector(haoshicaozuo)object:@selector

多线程

注意:iOS关于UI的刷新和添加必须在主线程中操作!

pthread的创建方法:

    pthread_t pthread;
    
    //第一个参数 线程指针
    //第二个参数 线程的一些属性
    //第三个参数 函数指针 用于执行方法
    //第四个参数 线程中的传值
    pthread_create(&pthread, NULL, run, NULL);

当应用程序刚运行的时候, 系统会自动为我们开放一个线程,该线程为主线程.

子线程是程序员用代码手动开启的线程,它存在的意义是为了执行耗时操作的任务.

一、NSThread的创建方法:

1.

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(haoshicaozuo) object:@"123"];
    thread.name = @"123";
    //开启线程
    [thread start];

2.快捷创建

[NSThread detachNewThreadSelector:@selector(haoshicaozuo) toTarget:self withObject:@"456"];
[self performSelectorInBackground:@selector(haoshicaozuo) withObject:@"123"];

下面一行代码指的是睡眠时间, 根据特定需求修改时长.

[NSThread sleepForTimeInterval:0.5];

二、NSOperation

NSOperation是一个抽象类,我们一般不直接使用它,而是使用它的子类NSInvocationOperation和NSBlockOperation,如果他们单独使用都是在主线程执行,只有和队列放在一起使用时在子线程执行.

NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction1) object:nil];
//    [operation1 start];
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction2) object:nil];
    NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 20; i < 30; i++) {
            NSLog(@"%d", i);
        }
    }];
    //加入到队列
    //mainQueue代表着主队列
//    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    
    //如果是alloc init 那就代表着其他对列
    //先加的先执行,后加的后执行, 但是执行的时间不一定, 可能后执行的比先执行的先执行完
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];

三、GCD

异步: 不在一个线程执行

同步: 在同一个线程执行 

串行: 串在一起执行

并行: 一起执行

同步 + 主队列   :所有通过GCD提交到主队列的任务必须是异步的, 否则会造成死锁

异步 + 主队列 : 不开辟线程, 就在主线程执行 (主队列就是串行的)

同步 + 串行对列: 不具备开启线程的能力, 在当前线程完成任务

异步 + 串行      :具备开启线程的能力, 但是任务是串行的,执行完一个才会去执行下一个

同步 + 并行队列 : 不具备开启线程的能力,并发的功能也就没用了

  并行队列的两种创建方式:

dispatch_queue_t queue = dispatch_queue_create("sb.2b.com", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

异步 + 并发队列

三(一):GCD网络请求:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    dispatch_queue_t queue = dispatch_queue_create("aaa", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSURL *url = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1464140268&di=6b6b2e3ea5da34b7da1e02fd28c7acd2&src=http://pic36.nipic.com/20131115/12106414_153522431000_2.jpg"];
        NSData *data = [NSData dataWithContentsOfURL:url];
        dispatch_sync(dispatch_get_main_queue(), ^{
            self.myImageView.image = [UIImage imageWithData:data];
        });
    });
    
}

三(二):GCD函数的使用:

延迟执行block

void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block); 

重复执行block,需要注意的是这个方法是同步返回,也就是说等到所有block执行完毕才返回,如需异步返回则嵌套在dispatch_async中来使用。多个block的运行是否并发或串行执行也依赖queue的是否并发或串行。

void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)); 

 

免责声明:文章转载自《iOS进阶之多线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#winform解析marc显示在datagridview中以及marc卡片显示SQLServer根据时间段查询数据下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QTablewidget通过代理实现限制输入

QTablewidget代理 之前做过一个QTablewidget想要限制某些单元格只能输入IP,刚开始采用在单元格中添加QLineEdit控件的方法,效果差强人意。后来发现通过QItemDelegate可以很方便实现需求。 QItemDelegate  1 #pragma once 2 #include <QWidget> 3 #inc...

C#并发编程

最近看C# 并发编程··,这里做一下总结··多线程,异步,并行,大部分都是最近看C#并发编程这个书涉及到的··这里仅仅列出实现方式,书里边介绍的其他的东西没有涉及比如取消操作,同步操作,集合之类的东西 线程:Thread,ThreadPool,BackgroundWorker, Thread 可以又更多控制··ThreadPool就是丢进去系统好管理线程,...

安装jseclipse到myeclipse中

三种安装方式:1、在线安装2、下载安装包进行安装3、下载解压缩包进行安装 一、在线安装方式:    a、打开Help窗口,即:Help > Software Update. 选择 Find and Install     b、选择 "Search for new features to install",点击 Next    c、点击 "New Re...

前端嵌入视频直播和聊天支持.m3u8格式

1、安装vue-video-player npm install vue-video-player --save 2、在main.js中引入vue-video-player import VideoPlayer from 'vue-video-player' require('video.js/dist/video-js.css') require('vu...

vue 点击展开显示更多 点击收起部分隐藏

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <style ty...

OpenCV4学习笔记(3.0)官方教程 | Load, Modify, and Save an Image 加载、修改和保存图像

本篇博客的主要内容是对官方OpenCV教程的翻译、总结与理解,并记录自己在学习过程中的心得体会。 官方教程地址:https://docs.opencv.org/4.3.0/db/d64/tutorial_load_save_image.html 阅读这篇博客之前,需要先掌握a如何使用cv::imread来读取图像和使用cv::imshow来显示图像,这...