zoukankan      html  css  js  c++  java
  • iOS中多线程常用的知识点

     
     
    1.pThread 跨平台的多线程技术 , 是IEEE制定的POSIX 表示可移植性操作系统接口的多线程计数,UNIX内核平台 Unix,Linux,Mac(小红帽) (windows上有可移植的版本),C语言的API。
     
    2.NSThread OC 线程技术
     
    3.该方法只是初始化了一个子线程,但是线程并没有开启,必须用【thread start】 开启线程
    target 调用对象
    SEL 绑定的事件
    object 附带的参数
     
    4.设置线程名字 thread.name = @"dbshuuv";
     
    5.绑定子线程的入口方法,直接开启线程
    】;
    6.隐式开启线程
    // 直接调用方法执行
    // [self performSelector:@selector(test1) withObject:nil];
    7.在后台线程调用 test1方法
    [self performSelectorInBackground:@selector(test1) withObject:nil];
    8.图片的下载
    UIImage * image = [UIImage imageWithData:[NSData datawithContentsOfURL:[NSURL URLWithString:@"图片地址"]]];
    9.从子线程中回到主线程
    [self performSelectorOnMainThread:@selector(mainThreadAction:) withObject:image waitUntilDone:YES];
     
    GCD
    1.GCD的创建
    dispatch_queue_t queue = dispatch_queue_creat("dsns",DISPATCH_QUEUE_SERIAL NULL); 串行队列的创建
     
    dispatch_queue_t queue = dispatch_queue_creat("dsns",DISPATCH_QUEUE_CONCURRENT); 并行队列的创建
     
    2.任务的添加
    dispatch_sync (queue,^{
    NSLog(@"同步任务的添加");
    });
    dispatch_async (queue,^{
    NSLog(@"异步任务的添加");
    });
    3.串行同步任务的添加,堵塞当前线程,知道自己执行完毕 , 串行异步任务的添加,依然会一个一个的执行, 并行同步任务的添加依旧是 一个一个的执行,并且都是在主线程上 ,
    并行异步任务的添加,开启了多个线程,保证运行速度
     
    4.队列组的创建
    dispatch_group_t group = dispatch_group_create();
    5.创建队列
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    6.向指定的队列中添加异步任务,并且将该队列和组关联起来
    dispatch_group_async(group, queue, ^{
    for (int i = 0; i < 5; i++) {
    NSLog(@"任务1");
    }
    });
     
    dispatch_group_async(group, queue, ^{
     
    for (int i = 0; i < 20000; i++) {
    NSLog(@"任务2");
    }
    });
    7.需要等到上诉所有的任务全部完成之后,不堵塞当前线程,在组的任务执行完之后,所要执行的总任务
     
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    等待所有的数据请求完毕之后,刷新界面UI
    NSLog(@"---------任务完成---------");
    });
     
    8.等待所有的队列任务完成
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
    9.dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (1ull * NSEC_PER_SEC));
    // group 扩展用法
    long result = dispatch_group_wait(group, time);
    if (result == 0) { // 如果任务执行完毕
    NSLog(@"任务执行完毕!!!");
     
    } else {
    NSLog(@"网络情况不佳,抛弃继续访问");
     
    }
     
    10.最常用的延迟调用,不会堵塞主线程,NSTimer不堵塞线程
    - (void)testDelayTime {
    // 1.调用runloop所属的perform delay
    [self performSelector:@selector(test) withObject:nil afterDelay:3];
     
    for(int i = 0; i < 10; i++) {
    NSLog(@"%d", i);
    }
    }
     
    11.睡眠当前线程3秒,在调用,堵塞当前线程
    - (void)testDelayTime2 {
    [NSThread sleepForTimeInterval:3];
    [self test];
     
    for(int i = 0; i < 10; i++) {
    NSLog(@"%d", i);
    }
    }
    12.GCD 创建单例
    + (instancetype)defaultViewController {
    static ViewController * vc = nil;
    // 保证线程安全,不会同一时间被多个线程访问
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
    vc = [[ViewController alloc] init];
    });
    return vc;
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Arduino学习笔记 (五) -- 红外接收与解码
    Arduino学习笔记 (四) -- 常用函数
    VSCode 基础必备插件
    Arduino学习笔记 (三) -- 语言基本概念
    Arduino学习笔记 (二) -- 常见板型
    Arduino学习笔记 (一) -- 概述
    一个好玩的东西:页面点击鼠标左键显示浮动文字
    Python多线程
    Nginx配置转发
    阿里云(CentOs)搭建SVN服务
  • 原文地址:https://www.cnblogs.com/houjiie/p/6182983.html
Copyright © 2011-2022 走看看