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;
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    ImageWatch 无法安装在VS2017环境下的解决方案
    Android CmakeList
    Android 工程越来越大,运行变卡解决方法
    奥卡姆剃刀(简约之法则)
    Cmake时 如何在windows命令行 选择vs版本
    ubuntu 18.04 安装tensorflow 2 cuda10 CUDNN Anaconda3
    Centos7简易通过yum安装phpmyadmin
    centos7 nigx 免费永久获取 Let‘s Encrypt 证书
    Execution failed for task ':app:compileDebugJavaWithJavac'
    centos 安装aconda
  • 原文地址:https://www.cnblogs.com/houjiie/p/6182983.html
Copyright © 2011-2022 走看看