iOS多线程 相关概念

iOS多线程 相关概念

1. 进程:进程(process):是指在系统中正在独立运行的一个应用程序. 比如同时打开QQ, Xcode,系统就会分别启动两个进程

2. 线程:线程(thread):是程序的一段执行序列,是进程的一部分

   2.1 线程的特点:

         a.每一个进程都至少要有一个线程,可以有多个线程

        b.适当数量线程能够提高程序的运行效率

  2.2 线程越多越好呢?

        a. iOS中主线程占用1M,子线程占用512KB

        b. 程序设计更加复杂


3. 多线程: 一个进程中同时运行多个线程,称为多线程并发

多线程在iOS中的应用

   3.1 一个ios程序启动的时候,默认会开启一个线程,该线程就是主线程

   3.2 主线程作用:显示/刷新UI界面;处理UI事件(点击事件、拖拽事件、滚动事件等)



四种多线程技术:

一. Pthread

POSIX (Portabel Operation System Interface): 可移植操作系统接口

优点: 基于c语言的api;可编写多平台应用;使用方便
缺点: 可自定义的功能少


创建线程

````

//子线程调用逻辑函数

void *pthreadTask(void *data) {

 //编写子线程相关逻辑

   return 0;

}

//调用pthread子线程函数

void launchPthread() {

   //1. 创建pthread_t  

pthread_t pid;

  //2. 创建线程

   pthread_create(&pid, 0, pthreadTask, 0);

  //3. 主线程相关逻辑

}

````



二. NSThread(不推荐使用)

1.优点:创建线程很方便

2.缺点:

  1)需要自己管理线程的生命周期,线程同步,加锁、开锁

  2) 管理多个线程比较非常困难

3.手动创建线程的三种方法

//方法一:NSThread实例方法创建线程

NSThread* myThread = [[NSThread alloc] initWithTarget:self  selector:@selector(doSomething:)  object:nil];

[myThread start];


//方法二:NSThread类方法:直接创建线程并且开始运⾏行线程

[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self  withObject:nil];

//⽅法三:NSObject实例⽅方法隐式创建线程
[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];



GCD(推荐使用)

特点:


1. 是基于C语言的底层接口
2. 使用block定义任务,使用起来灵活方便
3. 开发者不用直接跟线程打交道,只需要向队列中添加代码块即可
4. GCD在后端管理着一个线程池,集中管理线程

创建步骤

1.创建一个 dispatch_queue_t


dispatch_queue_t queue = dispatch_queue_create (“name”,NULL);

2.提交一个Block任务到队列中

dispatch_async(queue, ^{

// 异步执⾏的代码:网络下载,数据处理..

})

3.任何 UI 相关的操作都要回主队列中完成


dispatch_async(dispatch_get_main_queue, ^{

// 这⾥里写更新UI的代码

})


GCD其他用途

延时任务dispatch_after

1.准备好延时的时间变量dispatch_time_t

dispatch_queue_t queue = dispatch_queue_create (“name”,NULL);

2.准备好一个分发队列dispatch_queue_t


dispatch_queue_t queue = dispatch_get_main_queue();

3.将延时变量和分发队列传入dispatch_after函数


dispatch_after(delay, queue, ^{});


一次性任务dispatch_once

1.创建一个静态的GCD的单次任务变量dispatch_once_t

static dispatch_once_t onceToken;

2.将单任务变量和Block代码传入dispatch_once函数

dispatch_once(&onceToken, ^{});


NSOperation(推荐使用)

NSOperation进行多线程编程有两种方式(是并发编程的首选):

方式一: 使用NSOperation的两个子类:NSInvocationOperation和NSBlockOperation对线程 进行操作,这两个类的使用没有本质的区别,只是后者使用Block形式

方式二: 需要继承NSOperation类,并重写main方法(类似于Java中的java.lang.Runnable)


4. ios四种多线程技术

   a. PThread: 支持多平台(c语言);效率高

        1). 创建pthread_t

        2). 创建线程:pthread_create(&pid, 0, pTask,0);

   b. NSThread (不推荐使用):

        1). 创建线程很方便

        2). 缺点:需要手动创建;手动管理;线程同步;手动加锁、开锁

        3). 三种创建线程方法:

              1)). NSThread->实例方法:initWithTarget: 创建线程 —> 启动线程

              2)). NSThread->类方法:detachNewThreadSelector

              3)). NSObject->performSelectorInBackground(在后台运行 === 在字线程中运行)


      4). 线程有优先级:0.0 ~ 1.0 (defalt: 0.5)

            获取线程优先级方法:

            + (double) threadPriority;

             设置线程优先级

            +(BOOL)setThreadPriority:(double)p;

      5). 获取/设置线程的名字

            -(NSString *)name;

            -(void)setName: (NSString *)n;

         

   c. GCD

        特点:

         1)基于c语言

         2)使用block定义任务,使用起来灵活

         3)开发者不用直接和线程打交道,只需要在队列中添加代码逻辑即可

       

   创建线程:

         1). 创建一个dispatch_queue_t对象

          2). 提交一个block任务到队列中

          3). 讲ui相关的操作放回主线程


    延时任务:

         1). 创建延时变量dispatch_time_t

          2). 创建一个分发队列dispatch_queue_t

          3). 将延时变量和分发队列传入dispatch_after


    一次性任务:

        1). 创建一个静态的单任务变量dispatch_once_t

        2). 将这个单任务变量和block任务传个dispatch_once




   d. NSOperation & NSOperationQueue

        NSOperation进行对线程编程有两种方式:

        方式一:使用NSOperation的两个子类(NSInvocationOperation和NSBlockOperation)对线程进行操作,这两个子类的使用没有太大的区别,后者block形式

       方式二:需要继承NSOperation类,并重写main方法


       特点:

       1)面向对象,基于GCD之上的一套oc的接口

        2)不需要关心线程管理、数据同步问题,把精力放在执行代码的逻辑上





网络协议:

是网络上所有设备(网络服务器、计算机等)之间的通讯规则,它规定了通信时信息必须采用的格式和这些格式的意义。




http协议:

HyperText Transfer Protocol: 超文本协议

是用于www服务器传输超文本到本地浏览器的传输协议。

客户端(请求资源) ——> 服务器 —> 是否遵循http协议

1. —> 如果遵循 200—> 服务器告诉客户端 —> 允许访问我的资源(网页)—> 客户端的浏览器解析来自服务器的资源


2. —> 不遵循 —> 服务器告诉客户端(没有资源,请求失败,不遵循http协议)




Request:    请求    客户端 —>服务器

方法:get(获取 )put(更新) post(提交) delete(删除)

Response: 应答     服务器端返回的应答




iOS中的网络请求

NSURLSession(会话)的功能:

1. 通过url将数据下载到本地

2. 通过url将数据存储到内存

3. 将数据上传到服务器

4. 后台完成上述功能




样例:

1. 使用ios网络技术实现下载图片功能

2. 显示下载百分比

3. 断点续传




创建下载任务的步骤:

1. 创建NSURL对象

2. 根据这个url对象创建一个请求(request)

3. 调用单例的会话任务sharedSession

4. 在下载任务的回调函数(response)中进行相应的处理

    a. 判定返回的状态码(return code)

    b. 返回location是一个临时的文件夹,使用NSFileManger类的moveItem函数来保存到Documents文件夹下


5. 调用resume函数来发送请求

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 欢迎大家指出文章中需要改正或者需要补充的地方,我会及时更新,非常感谢。 一. 多线程基础 1. 进程 进程是指在系...
    xx_cc阅读 7,169评论 11 70
  • 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案...
    张战威ican阅读 599评论 0 0
  • .一.进程 进程:是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空...
    IIronMan阅读 4,469评论 1 33
  • 星期五,我们三年级的全体同学去二桥秋游。 从星期四听到叶老师宣布去秋游的消息,我的心情就开始既激动又紧张: 激动的...
    快乐的月亮公主阅读 341评论 0 0
  • AFN作为iOS最流行的第三方库,确实为开发者省去了很多麻烦的代码,加入自己使用NSURLSeesion或者NSU...
    会笑的Even阅读 1,207评论 0 0