博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS-多线程
阅读量:6200 次
发布时间:2019-06-21

本文共 6116 字,大约阅读时间需要 20 分钟。

1 //  ViewController.m  2 //  IOS_0111_多线程  3 //  4 //  Created by ma c on 16/1/11.  5 //  Copyright (c) 2016年 博文科技. All rights reserved.  6 //  7   8 #import "ViewController.h"  9  10 @interface ViewController () 11  12 @end 13  14 @implementation ViewController 15  16 - (void)viewDidLoad { 17     [super viewDidLoad]; 18      19 //    [self textTongBu]; 20 //    [self textYiBu]; 21 //    [self textSelfMode]; 22 //    [self testGroup]; 23      24      25     //在主队列中刷新 26     //在某个block当中的代码的确被执行了,但是在界面中没有效果,这时可以考虑在主队列中执行block中的代码 27 //    [self  testMainQueueRefresh]; 28      29     //延时操作 30     [self testDelay]; 31 } 32 #pragma mark - 延时操作 33 - (void)testDelay 34 { 35     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 36         NSLog(@"延迟4s执行"); 37     }); 38 } 39  40 #pragma mark - 主队列中刷新 41 - (void)testMainQueueRefresh 42 { 43     void (^block)(void) = ^{ 44          45         //NSLog(@"请求了大量的数据,记载在表格中"); 46         //出现了一个问题,数据请求完毕了,但是没有加载在表格中 47          48         dispatch_async(dispatch_get_main_queue(), ^{ 49             //在这里执行的指令,相当于在主线程中执行 50             NSLog(@"请求了大量的数据,记载在表格中"); 51         }); 52     }; 53     block(); 54      55      56 } 57 #pragma mark - 测试队列组的顺序激发 58 - (void)testGroup 59 { 60     //在队列组中,指令的执行顺序由程序员控制 61     dispatch_group_t group = dispatch_group_create(); 62      63     dispatch_queue_t queue = dispatch_queue_create("www.bowen.com", DISPATCH_QUEUE_CONCURRENT); 64     dispatch_group_async(group, queue, ^{ 65         NSLog(@"执行事件1"); 66     }); 67     dispatch_group_async(group, queue, ^{ 68         NSLog(@"执行事件2"); 69     });    dispatch_group_async(group, queue, ^{ 70         NSLog(@"执行事件3"); 71     }); 72     dispatch_group_notify(group, queue, ^{ 73         NSLog(@"最后执行"); 74     }); 75 } 76  77 #pragma mark - 线程测试 78 //测试同步线程中,指令的执行过程 79 - (void)textTongBu 80 { 81     //在主线程中执行 82     dispatch_async(dispatch_get_main_queue(), ^{ 83         NSLog(@"在线程中要做某事1"); 84     }); 85     dispatch_async(dispatch_get_main_queue(), ^{ 86         NSLog(@"在线程中要做某事2"); 87     }); 88     dispatch_async(dispatch_get_main_queue(), ^{ 89         NSLog(@"在线程中要做某事3"); 90     }); 91     dispatch_async(dispatch_get_main_queue(), ^{ 92         NSLog(@"在线程中要做某事4"); 93     }); 94 } 95 //测试异步线程中,指令的执行过程 96 - (void)textYiBu 97 { 98     //第一个参数:表示队列的类型 99     //第二个参数:100     dispatch_queue_t queue =101     dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);102     103     dispatch_async(queue, ^{104         NSLog(@"在线程中要做某事1");105     });106     dispatch_async(queue, ^{107         NSLog(@"在线程中要做某事2");108     });109     dispatch_async(queue, ^{110         NSLog(@"在线程中要做某事3");111     });112     dispatch_async(queue, ^{113         NSLog(@"在线程中要做某事4");114     });115 }116 //自定义队列117 - (void)textSelfMode118 {119     //第一个参数:字符串标志120     //第二个参数:队列属性121     dispatch_queue_t customQueue = dispatch_queue_create("www.bowen.com", DISPATCH_QUEUE_CONCURRENT);122     dispatch_async(customQueue, ^{123         NSLog(@"在线程中要做某事1");124     });125     dispatch_async(customQueue, ^{126         NSLog(@"在线程中要做某事2");127     });    dispatch_async(customQueue, ^{128         NSLog(@"在线程中要做某事3");129     });130     dispatch_async(customQueue, ^{131         NSLog(@"在线程中要做某事4");132     });133 }134 135 #pragma mark - 线程的基础知识136 137 - (void)showThreadInfo138 {139     /*140      1.什么是线程?线程与进程区别?141      线程:thread - 程序执行流的最小基本单元142      进程:process - 一个进程就是一个程序143      一个线程就是在一个程序中完成一个任务的链144      一个进程可以有多个线程(进程包含线程)145      ps:如果一个进程只有一个线程,这个线程就是当前程序146      pss:在一个程序中使用多个线程完成不同的任务的操作,叫做多线程147      psss:线程被放置在线程队列(FIFO)中,在GCD中,叫dispatch queue,保证先进来的线程优先得到执行148      149      线程并不是一直都在执行的 - 非线性的不连续状态150      线程的三种状态:[就绪] [运行] [阻塞]151      就绪:线程的各个被执行的逻辑条件都满足,逻辑上能执行,等待[处理机]调度执行152      运行:处理机正在处理线程153      阻塞:等待逻辑条件都被满足,等待的是指令(函数、block),逻辑上不能运行154      155      2.多线程的实现方式有几种?156      线程实现方式:157      串行:线程中的任务想要执行必须等待[上一个任务]完成158      并行:线程中的任务想要执行必须等待[上一个任务]开始159      同步:线程的执行时间与主线程同步160      异步:线程的执行时间与主线程不同步161      162      同步串行:在一个与主线程同步的线程中,同步执行任务163      ps:在计算机中除了主线程外,其余线程都是并行性质164      异步串行:在与一个主线程不同步的线程中,异步执行任务165      166      同步并行:线程中多个任务同时向前推进167      异步并行:线程中多个任务同时进行,但完成度不同168      169      3.IOS中多线程的实现方式170      NSThread 线程操作171      Cocoa NSOperation + NSOperationQueue 线程管理172      GCD(Grand Center Dispatch) 中央队列处理173      174      NSThread175      创建线程,执行线程,关闭线程,在线程中发布指令176      缺点:繁琐,不利于使用177      优点:逻辑简单,浅显易懂178      179      NSOperationQueue180      (1)NSStackQueue NSBlockQueue181      (2)NSOperation182      优点:免去了程序员创建线程,管理数据调度等操作,只要程序员发布指令即可183      缺点:太繁琐,由于实现方式不同,不便于代码的管理和功能的调和184      185      GCD(Grand Center Dispatch)186      缺点:由于实现简单造成的抽象性太强,不便于理解187      优点:程序员不用再管理线程188      189      4.什么是GCD-集中式中央队列处理190      Mac OSX 6.0 +Xcode4.0 引进GCD[集中式中央队列处理]191      192      在gcd中,程序员操作的东西队列,队列组193      好处:解决了线程操作的繁琐,队列管理十分简单194      195      FIFO -> disPatch Queue196      197      5.GCD队列类型有几种198      主队列:199      后台队列:200      高优先级队列:201      低优先级队列:202      默认优先级队列:203      204      6.GCD中队列的执行方式有几种205      同步、异步206      ps:坚决不能在主队列中开启同步队列,因为会造成主队列死锁207      208      7.线程基本操作209      获取主队列 - dispatch_get_main_queue()210      //异步加载211      dispatch_async(dispatch_get_main_queue(), ^{212      NSLog(@"在一个主线程中做某些事");213      [tableView reloadData];214      });215      216      开启新队列217      dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)218      (1)开启同步队列219      dispatch_sync(dispatch_queue_t queue, <#^(void)block#>)220      第一个参数:开启的队列221      第二个参数:队列中要执行的命令222      223      (2)开启异步队列224      dispatch_async(dispatch_queue_t queue, <#^(void)block#>)225      226      //所有刷新UI的操作都必须在主线程中执行227      228      */229     230 }231 232 - (void)didReceiveMemoryWarning {233     [super didReceiveMemoryWarning];234     // Dispose of any resources that can be recreated.235 }236 237 @end
1 + (Globle *)shareGloble 2 { 3     static dispatch_once_t onceToken; 4     dispatch_once(&onceToken, ^{ 5         globle = [[Globle alloc] init]; 6         globle.userId = @""; 7     }); 8      9     return globle;10 }

 

转载地址:http://jbtca.baihongyu.com/

你可能感兴趣的文章
假如 Micromedia 没被收购,会不会早于 Apple 推动 H5、CSS3 的发展
查看>>
简洁的 c# 拖动无标题栏窗体
查看>>
899F - Letters Removing
查看>>
Codeforces 961E - Tufurama
查看>>
ListView
查看>>
linux修改ftp上传路径
查看>>
【C语言】第一个C语言小程序 —— 日期算法和万年历
查看>>
eclipse中svn插件在线安装方式
查看>>
js 的 this
查看>>
Cetnos搭建vsftp服务器
查看>>
Js数据类型、Json格式、Json对象、Json字符串
查看>>
C# 特性篇 Attributes
查看>>
隐藏sharepoint列表栏
查看>>
Effective java 读书笔记
查看>>
【学习】在Windows10平台使用Docker ToolBox安装docker(一)
查看>>
JVM调优总结 -Xms -Xmx -Xmn -Xss
查看>>
ZOJ 3913 Bob wants to pour water
查看>>
PAT (Advanced Level) 1036. Boys vs Girls (25)
查看>>
克拉默法则(Cramer's Rule)的证明
查看>>
(转)解释一下SQLSERVER事务日志记录
查看>>