资讯专栏INFORMATION COLUMN

IOS学习总结(1)——关于并发

summerpxy / 1521人阅读

摘要:我就个人感受而言,总结一下并发编程以及相关的一些知识。实际上,所有的并发编程都是构建于线程之上的包括和操作队列。当方法执行结束后,运行时会特地清理并弃掉线程。

本文仅作为个人学习总结记录使用!能力有限,难免会有疏漏和错误,还望指出。共同进步。

独白

工作学习IOS已经有半年了,一直都想抽出时间记录一下自己的学习和工作经验,但都写到一半,就没有然后了。关于并发编程,其实国外国内已经有各种牛人总结过非常棒的文章,但大多都是碎片化的文章。我就个人感受而言,总结一下并发编程以及相关的一些知识。

遇到的问题

关于并发编程,大部分的教程要么是直接介绍GCD(Grand Central Dispatch
),要么就是上一大堆的Operation Queues,还有介绍Threads来完成并发。

其实他们都能实现并发,但他们之间有什么区别呢?又有什么联系呢?

block和GCD的区别?

关于delegate和block的使用

OS X和iOS中的并发编程

在移动和桌面操作系统中,苹果提供了相同的并发编程API。 常用的分别是:pthread和NSThread,Grand Central Dispatch(GCD)以及NSOperationQueue
由于高层API是基于底层API构建的,所以首先将从底层的API开始介绍,然后逐步介绍高层API,不过在具体编程中,选择API的顺序刚好相反:因为大多数情况下,选择高层的API不仅可以完成底层API能完成的任务,而且能够让并发模型变得简单。

Threads
线程(thread)是组成进程的子单元,操作系统的调度器可以对线程进行多带带的调度。实际上,所有的并发编程API都是构建于线程之上的——包括GCD和操作队列(operation queues)。

一般在工作中,都不会使用pthread和NSThread,因为使用pthread或NSThread会引发一个问题:你创建了8个线程,然后在这些线程中调用了框架代码,这些代码也创建了同样的线程(其实它并不知道你已经创建好线程了),这样会很快产生成千上万个线程,最终导致你的程序被终止执行——线程实际上并不是免费的咖啡,每个线程的创建都会消耗一些内容,以及相关的内核资源
基于队列的并发编程API:GCD和operation queue。它们通过集中管理一个线程池(被没一个任务协同使用),来解决上面遇到的问题

Grand Central Dispatch
通过GCD,开发者不用再直接跟线程打交道了,只需要向队列中添加block代码即可,GCD在后端管理着一个线程池。GCD不仅决定着哪个线程(block)将被执行,它还根据可用的系统资源对线程池中的线程进行管理——这样可以不通过开发者来集中管理线程,缓解大量线程的创建,做到了让开发者远离线程的管理。
更多GCD的使用请参考:Low-Level Concurrency APIs

Operation Queues
操作队列(operation queue)是基于GCD封装的一个队列模型。GCD提供了更加底层的控制,而操作队列在GCD之上实现了一些方便的功能,这些功能对于开发者来说会更好、更安全。
关于Operation Queues比较好的文章:Common Background Practices

NSObject
如果你只想让一些代码在后台执行,NSObject也提供了方法。这些方法的名字中都有“performSelector:”,最简单的就是“performSelectorInBackground:withObject:”,它能在后台执行一个方法。它通过创建一个线程来运行方法。定义这些方法必须遵循一下限制:

这些方法运行在各自的线程里,因此你必须为这些Cocoa对象创建一个自动释放池,而主动释放池是与主线程相关的。(arc,请无视)

这些方法不能有返回值,并且要么没有参数,要么只能有一个参数。换句话说,你只能使用以下代码格式中的一种。

-(void)myMethod;

-(void)myMethod:(id)myObject;

记住这些限制,我们实现的代码应该如下所示:

-(void)myBackgroudMethod{
   @autoreleasepool{
   //todo
   }
}

-(void)myOtherBackgroudMethod:(id)myObject{
   @autoreleasepool{
   // TODO
   }
}

同时调用的时候,应该像这样。

[self performSelectorInBackground:@selector(myBackgroudMethod) withObject:nil];

[self performSelectorInBackground:@ selector(myOtherBackgroudMethod:)  withObject: myObject];

这样就完成了。当方法执行结束后,OC运行时会特地清理并弃掉线程。需要注意,方法执行结束后并不会通知你:这是比较简单的代码

配合NSObject的

  

performSelectorOnMainThread

也能达到GCD的效果:

-(void)myOtherBackgroudMethod:(id)myObject{
   @autoreleasepool{
   // TODO
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:obj waitUntilDone:YES];
   }
}

-(void)updateUI:(NSObject *)obj{
    // TODO
}
关于block

个人认为比较好的文章:
初识block:
Block剧终:Objective-C中的闭包性和匿名函数:

关于GCD和block之间的区别

Gcd说到底其实就是方便操作线程的一个开源库,并使用了block当做参数来传递这一特性。
Block其实就是OC的匿名函数,并具有闭包的特性,而且可以很容易的获取上下文的信息。和gcd有着本质的区别

总结

以上都是我学习中的总结和注释而已。篇幅不多,大多都是站在别人的肩膀上。主要是给自己回顾和完善知识体系用的。如果有不对的地方,欢迎指出。

参考文章:Concurrent Programming: APIs and Challenges

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/15424.html

相关文章

  • iOS进阶

    摘要:然而,副作用对于系统的可测试性来说就是一剂毒药,并且可能会因应用程序和请求的不同而出现差异性。这些事件并不具备特定时序性,甚至它们可能同时发生。粘性动画中,粘性小球会根据移动距离的大小拥有不同的弹性程度。 PPAsyncDrawingKit - 实现了一系列基础 UI 控件的轻量级 ASDK 一款轻量级的 ASDK,实现了一系列基础 UI 控件。 iOS 开发之 Runtime 常用示...

    Cheng_Gang 评论0 收藏0
  • iOS 入门必读 - 收藏集 - 掘金

    摘要:目前正在准备阶段,为了更好的方便阅读,等完成后还是会放到看云上,里面会快捷之道轻松地使用掘金作者,原文链接,原文日期译者校对定稿这是篇拆开即食的福利小短文。 Web 开发实战 - 前端 - 掘金 《Web开发实战》是作者的第二本技术书籍,集合了大量的开发案例,目前主要选择日常开发中会用到的加入本书,分为四部分:CSS实战篇、JavaScript实战篇、Canvas实战篇和移动实战篇。目...

    whlong 评论0 收藏0
  • iOS面试

    摘要:首先要有空杯的学习心态,而不是傲娇自满,面试宝典本篇文章总结多年来开发人员面试常问到的问题,也希望能够带领刚入门的同志们走入职场。这样面试技巧及问题最全梳理,让的不再难拿目前形势,参加到队伍的人是越来越多,甚至已经到供过于求了。 iOS category内部实现原理 无论一个类设计的多么完美,在未来的需求演进中,都有可能会碰到一些无法预测的情况。那怎么扩展已有的类呢?一般而言,继承和组...

    printempw 评论0 收藏0
  • iOS多线程:『NSOperation、NSOperationQueue』详尽总结

    摘要:本文用来介绍多线程中的相关知识以及使用方法。使用步骤需要配合来实现多线程。从而印证了中的操作也可能会在其他线程非当前线程中执行。而且一个操作也并非只能在一个线程中运行。 showImg(https://segmentfault.com/img/remote/1460000015073523); 本文首发于我的个人博客:『不羁阁』 文章链接:传送门 本文更新时间:2018年03月06...

    Shisui 评论0 收藏0
  • 计算机常识 - 收藏集 - 掘金

    摘要:使用简记后端掘金全称为即消息队列。优测优社区干货精选老司机乱谈编辑器之神掘金前言是一种信仰,我自从年有了这个信仰,已经个年头了。 PHP 程序员进阶学习书籍参考指南 - 后端 - 掘金PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18 ... 当我们在谈论前端加密时,我们在谈些什么 - 前端 - 掘金潘建旭,岂安科技(www.bigse...

    Yi_Zhi_Yu 评论0 收藏0

发表评论

0条评论

summerpxy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<