iOS多线程中performSelector: 和dispatch_time的不同


iOS中timer相关的延时调用,常见的有NSObject中的performSelector:withObject:afterDelay:这个方法在调用的时候会设置当前runloop中timer,还有一种延时,直接使用NSTimer来配置任务。

这两种方式都一个共同的前提,就是当前线程里面需要有一个运行的runloop并且这个runloop里面有一个timer。

我们知道:只有主线程会在创建的时候默认自动运行一个runloop,并且有timer,普通的子线程是没有这些的。这样就带来一个问题了,有些时候我们并不确定我们的模块是不是会异步调用到,而我们在写这样的延时调用的时候一般都不会去检查运行时的环境,这样在子线程中被调用的时候,我们的代码中的延时调用的代码就会一直等待timer的调度,但是实际上在子线程中又没有这样的timer,这样我们的代码就永远不会被调到。

下面的代码展示了performSelector和dispatch_time的不同

/*
 testDispatch_after 延时添加到队列
 */
-(void) testDispatch_after{
    dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3*NSEC_PER_SEC);
    dispatch_after(time, dispatch_get_main_queue(), ^{
        NSLog(@"3秒后添加到队列");
    });
}
-(void) testDelay{
    NSLog(@"3秒后testDelay被执行");
}
/*
 dispatch_barrier_async 栅栏的作用
 */
-(void) testDispatch_Barrier{
    //dispatch_queue_t gcd = dispatch_queue_create("这是序列队列", NULL);
    dispatch_queue_t gcd = dispatch_queue_create("这是并发队列", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(gcd, ^{
        NSLog(@"b0");
        //这个selector不会执行
        [self performSelector:@selector(testDelay) withObject:nil afterDelay:3];
        //代码会执行
        //[self testDispatch_after];
    });
    dispatch_release(gcd);
}

在有多线程操作的环境中,这样performSelector的延时调用,其实是缺乏安全性的。我们可以用另一套方案来解决这个问题,就是使用GCD中的dispatch_after来实现单次的延时调用

时间: 2024-10-11 07:08:44

iOS多线程中performSelector: 和dispatch_time的不同的相关文章

iOS多线程中,队列和执行的排列组合结果分析

本文是对以往学习的多线程中知识点的一个整理. 多线程中的队列有:串行队列,并发队列,全局队列,主队列. 执行的方法有:同步执行和异步执行.那么两两一组合会有哪些注意事项呢? 如果不是在董铂然博客园看到这边文章请 点击查看原文 提到多线程,也就是四种,pthread,NSthread,GCD,NSOperation 其中phtread是跨平台的.GCD和NSOperation都是常用的,后者是基于前者的. 但是两者区别:GCD的核心概念是将一个任务添加到队列,指定任务执行的方法,然后执行. NSO

iOS多线程中的单例

1 #import "MyHandle.h" 2 3 static MyHandle *handle = nil; 4 @implementation MyHandle 5 // 传统写法 6 // 此时如果多个任务并发执行,他就不会满足单例的优点 7 //+ (MyHandle *)shareMyHandle { 8 // if (nil == handle) { 9 // handle = [[MyHandle alloc] init]; 10 // } 11 // return

ios多线程中 同步、异步与队列之间的关系

同步和异步 异步: 指的就是多线程, 把`对应的代码`放到其他线程中去执行, 当前线程的代码就继续往下执行,不需要等到刚才放到子线程中的代码执行完毕. 同步执行函数: 这个实际的应用场景不多 , 了解即可 登录,注册 需要放到一个队列中去执行 下载文件 需要放到另外一个队列去执行 异步执行函数: 串行队列特点: 如果要开启线程,只会开启一条线程 (同步函数执行时, 如果队列是串行队列,不需要开启线程, 任务在当前线程中执行) (异步函数执行时, 如果队列是串行队列,可以开启线程,并且只能开启一条

iOS 多线程:『GCD』详尽总结

本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 3. GCD 的使用步骤 4. GCD 的基本使用(6种不同组合区别) 5. GCD 线程间的通信 6. GCD 的其他方法(栅栏方法:dispatch_barrier_async.延时执行方法:dispatch_after.一次性代码(只执行一次):dispatch_once.快速迭代方法:dis

iOS开发中的gcd多线程tips

iOS开发中的gcd多线程tips 我们经常用到的: dispatch_async(dispatch_get_global_queue(0, 0), ^{ // 处理耗时操作的代码块 //通知主线程刷新 dispatch_async(dispatch_get_main_queue(), ^{ //回调或者说是通知主线程刷新 }); }); 其中main_queue是系统默认的串行队列,global_queue是系统默认的并行队列. 什么是串行队列(Serial)? 创建任意个数的串行队列,每个队

iOS开发——多线程OC篇&多线程中的单例

多线程中的单例 1 #import "DemoObj.h" 2 3 @implementation DemoObj 4 5 static DemoObj *instance; 6 7 8 9 // 在iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法 10 // 如果要做单例,需要重写此方法 11 // GCD提供了一个方法,专门用来创建单例的 12 + (id)allocWithZone:(struct _NSZone *)zone 13 { 14 sta

iOS开发中GCD在多线程方面的理解

GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0. GCD是一个替代诸如NSThread等技术的很高效和强大的技术.GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题. GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识. 在开始之前,需要理解是要提供给GCD队列的是代

ios开发中 线程、进程即多线程简单介绍

本文转自:原文http://www.cnblogs.com/wendingding/p/3805088.html 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线

iOS设计中多线程的简单介绍

1.什么是多线程,表现方式有哪些,都有哪些优缺点 进程是程序的实体 进程是程序的一次执行,进程是线程的容器 线程是轻量级进程,是程序执行流的最小单位 多线程的概念: 单个程序同时运行多个线程完成不同的任务,称为多线程,是指从软件或者硬件实现多个线程并发执行的技术 为什么使用多线程: 节约CPU时间,避免程序卡死 多线程技术是防止主线程堵塞和增加运行效率的最佳方法 怎样实现多线程(表现方式): NSThread:是三种方法中轻量级,但需要管理线程的生命周期,同步,加锁问题,会导致一定的性能开销 N