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

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

系列文章:

多线程运用

线程同步

所谓线程同步就是为了防止多个线程抢夺同一个资源造成的数据安全问题,所采取的一种措施。当然也有很多实现方法,请往下看:

  • 互斥锁 :给需要同步的代码块加一个互斥锁,就可以保证每次只有一个线程访问此代码块。

OBJECTIVE-C

@synchronized(self) {  //需要执行的代码块}复制代码

SWIFT

objc_sync_enter(self)//需要执行的代码块objc_sync_exit(self)复制代码
  • 同步执行 :我们可以使用多线程的知识,把多个线程都要执行此段代码添加到同一个串行队列,这样就实现了线程同步的概念。当然这里可以使用 GCD 和 NSOperation 两种方案:
//GCD//需要一个全局变量queue,要让所有线程的这个操作都加到一个queue中dispatch_sync(queue, ^{    NSInteger ticket = lastTicket;    [NSThread sleepForTimeInterval:0.1];    NSLog(@"%ld - %@",ticket, [NSThread currentThread]);    ticket -= 1;    lastTicket = ticket;});//NSOperation & NSOperationQueue//重点:  1. 全局的 NSOperationQueue, 所有的操作添加到同一个queue中//       2. 设置 queue 的 maxConcurrentOperationCount 为 1//       3. 如果后续操作需要Block中的结果,就需要调用每个操作的waitUntilFinished,阻塞当前线程,一直等到当前操作完成,才允许执行后面的。waitUntilFinished 要在添加到队列之后!NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{    NSInteger ticket = lastTicket;    [NSThread sleepForTimeInterval:1];    NSLog(@"%ld - %@",ticket, [NSThread currentThread]);    ticket -= 1;    lastTicket = ticket;}];[queue addOperation:operation];[operation waitUntilFinished];//后续要做的事复制代码

延迟执行

所谓延迟执行就是延时一段时间再执行某段代码。下面说一些常用方法。

  • perform
// 3秒后自动调用self的run:方法,并且传递参数:@"abc"[self performSelector:@selector(run:) withObject:@"abc" afterDelay:3];复制代码
  • GCD

可以使用 GCD 中的 dispatch_after 方法

// 创建队列dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);// 设置延时,单位秒double delay = 3; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delay * NSEC_PER_SEC)), queue, ^{  // 3秒后需要执行的任务});复制代码
  • NSTimer

NSTimer 是iOS中的一个计时器类,除了延迟执行还有很多用法,不过这里直说延迟执行的用法。

[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(run:) userInfo:@"abc" repeats:NO];复制代码

单例模式

static HLUserManager *_singleton = nil;@implementation HLUserManager+ (instancetype)sharedManager {        static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _singleton = [[HLUserManager alloc] init];    });    return _singleton;}@end复制代码

下面看 Swift 中的单例模式,在Swift中单例模式非常简单!想知道怎么从 OC 那么复杂的方法变成下面的写法的,

SWIFT

class Tool: NSObject {    static let sharedTool = Tool()    // 私有化构造方法,阻止其他对象使用这个类的默认的'()'构造方法    private override init() {}}复制代码

从其他线程回到主线程的方法

我们都知道在其他线程操作完成后必须到主线程更新UI。所以,介绍完所有的多线程方案后,我们来看看有哪些方法可以回到主线程。

  • NSThread
//Objective-C[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:NO];//Swift//swift 取消了 performSelector 方法。复制代码
  • GCD
//Objective-Cdispatch_async(dispatch_get_main_queue(), ^{});//Swiftdispatch_async(dispatch_get_main_queue(), { () -> Void in})复制代码
  • NSOperationQueue
//Objective-C[[NSOperationQueue mainQueue] addOperationWithBlock:^{}];//SwiftNSOperationQueue.mainQueue().addOperationWithBlock { () -> Void in}复制代码

转载于:https://juejin.im/post/5a7198ee5188257341083f23

你可能感兴趣的文章
【ASM】ASMCMD chtmpl 更改ASM 模版的属性
查看>>
android动手写控件系列——老猪叫你写相机
查看>>
网站打不开
查看>>
颠覆大数据分析之Spark为Shark所提供的扩展
查看>>
⑪云上场景:大掌门,架构分层部署实践经验
查看>>
【SICP练习】41 练习1.46
查看>>
Swift游戏开发之俄罗斯方块:No.5 Block Party
查看>>
hdu 5280 Senior's Array
查看>>
剑指offer系列之十八:顺时针打印矩阵
查看>>
不借助第三方插件利用ScrollView自身delegate实现下拉刷新和上拉加载
查看>>
如何设置Docker容器中Java应用的内存限制
查看>>
推荐几款工具
查看>>
深入浅出: 大小端模式
查看>>
深入浅出: Java回调机制(异步)
查看>>
Aliyun OSS Nginx proxy module(阿里云OSS Nginx 签名代理模块)
查看>>
linux中的mdev机制
查看>>
use zfs snapshot rollback postgresql's primary to old status in PG HA
查看>>
btrfs 使用指南 - 1 概念,创建,块设备管理,性能优化
查看>>
Android Studio 3.0 上 Gradle 改动
查看>>
[Vue]1-5. Vue.js核心知识之组件化
查看>>