延时执行:
IOS常见的延时执行有2种方式
调用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// 2秒后调用self的run方法
使用GCD函数
dispatch_after(dispatch_time(DISPATCH_TIME_NOW), (int64_t)(2.0*NSEC_PER_SEC), dispatch_get_main_queue(), ^{
// 2秒之后异步执行这里的代码
});
一次性执行代码:
使用dispatch_once函数能保证某段代码在程序运行过程中只被执行一次。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});
队列组:
有这么一种需求
首先:分别异步执行2个耗时的操作。
其次:等2个异步操作都执行完毕后,再回到主线程执行操作。
如果想快速高效的实现上述需求,可以考虑用队列组。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 执行一个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 执行一个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程......
IOS常见的延时执行有2种方式
调用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// 2秒后调用self的run方法
使用GCD函数
dispatch_after(dispatch_time(DISPATCH_TIME_NOW), (int64_t)(2.0*NSEC_PER_SEC), dispatch_get_main_queue(), ^{
// 2秒之后异步执行这里的代码
});
一次性执行代码:
使用dispatch_once函数能保证某段代码在程序运行过程中只被执行一次。
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});
队列组:
有这么一种需求
首先:分别异步执行2个耗时的操作。
其次:等2个异步操作都执行完毕后,再回到主线程执行操作。
如果想快速高效的实现上述需求,可以考虑用队列组。
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 执行一个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 执行一个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程......
});
代码运行如下:
//
// ViewController.m
// GCD的延迟操作
//
// Created by apple on 15/10/21.
// Copyright (c) 2015年 LiuXun. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self once];
}
#pragma mark - 延时操作
-(void)delay
{
/**
参数:now 0
NSEC_PRE_SEC: 很大的数字
*/
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0*NSEC_PER_SEC));
// 参数when:表示从现在开始,经过多少纳秒以后
// queue:在哪个队列里执行后面的任务
dispatch_after(when, dispatch_get_main_queue(), ^{
NSLog(@"XXXX---------%@", [NSThread currentThread]);
});
dispatch_after(when, dispatch_get_global_queue(0, 0), ^{
NSLog(@"XXXX---------%@", [NSThread currentThread]);
});
}
-(void)group
{
/**
应用场景:
开发的时候,有时候出现多个网络请求都完成以后(每一个网络请求的时间长短不一定相同),再统一通知用户。
比如下载小说:三国演义,红楼梦,金瓶梅
*/
// 实例化一个调度组 : 调度组只是对队列的一个分组而已,仍然需要队列
dispatch_group_t group = dispatch_group_create();
// 队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
// 任务添加到队列queue
dispatch_group_async(group, queue, ^{
NSLog(@"下载小说A--------%@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"下载小说B--------%@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"下载小说C--------%@", [NSThread currentThread]);
});
dispatch_group_async(group, queue, ^{
NSLog(@"下载小说D--------%@", [NSThread currentThread]);
});
// 获得所有调度组里面所有的的异步任务完成的通知
// dispatch_group_notify(group, queue, ^{ // 异步的
// NSLog(@"下载小说完成,请观看-------%@", [NSThread currentThread]);
// });
// 在调度组完成通知里,可以跨队列通信
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ // 异步的
// 一般需要在主线程更新UI
NSLog(@"下载小说完成,请观看-------%@", [NSThread currentThread]);
});
}
#pragma mark- 一次性执行
-(void)once
{
static dispatch_once_t onceToken; //command 进入得: typedef long dispatch_once_t;
NSLog(@"%ld", onceToken);
dispatch_once(&onceToken, ^{ // 此块中的代码只会执行一次
NSLog(@"%ld", onceToken);
NSLog(@"只执行一次");
});
NSLog(@"完成");
}
@end