您的位置:首页 > 移动开发 > IOS开发

IOS线程数据篇8之GCD功能使用大全:队列阻塞挂起(一次激活所有阻塞任务)

2014-11-24 16:08 417 查看
多线程中GCD的使用是IOS中一个线程使用的一个非常重要的部分,

下面分析一下队列挂起如何使用:

q1 = dispatch_queue_create("com.fwzhengwei.www", DISPATCH_QUEUE_CONCURRENT);

dispatch_suspend(q1);

首先创建一个队列,设置为并行队列,并将这个队列挂起。

之后在另一个方法中添加如下代码:

for (int i = 0; i < 10; ++i) {

NSLog(@"任务已经挂起无法启动!");

dispatch_async(q1, ^{

NSLog(@"%@ %d", [NSThread currentThread], i);

});

}

这里所有的任务添加到队列之后,实际上队列是挂起的。

当点击按钮之后,在按钮的回调方法中:

-(void)buttonaction1{

NSLog(@"xxxxx 激活所有阻塞线程");

dispatch_resume(q1);

}

代码的运行结果可以参考如下:

程序启动

2014-11-24 16:05:25.757 GCDTest[1996:145594] buttonaction

所有子线程任务都被挂起

2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.758 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!

2014-11-24 16:05:25.759 GCDTest[1996:145594] 任务已经挂起无法启动!

点击按钮之后所有的队列中的任务都被重新激活

2014-11-24 16:05:26.469 GCDTest[1996:145594] xxxxx 激活所有阻塞线程

2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 0

2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 2

2014-11-24 16:05:26.470 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 1

2014-11-24 16:05:26.470 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 3

2014-11-24 16:05:26.470 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 4

2014-11-24 16:05:26.470 GCDTest[1996:145633] <NSThread: 0x7ba87970>{number = 4, name = (null)} 5

2014-11-24 16:05:26.471 GCDTest[1996:145631] <NSThread: 0x7ae4dd50>{number = 2, name = (null)} 7

2014-11-24 16:05:26.470 GCDTest[1996:145634] <NSThread: 0x7b82ffe0>{number = 5, name = (null)} 6

2014-11-24 16:05:26.471 GCDTest[1996:145632] <NSThread: 0x7b933a30>{number = 3, name = (null)} 8

2014-11-24 16:05:26.471 GCDTest[1996:145633] <NSThread: 0x7ba87970>{number = 4, name = (null)} 9

dispatch除了可以挂起任务之外,还有一个单例的功能。

dispatch_once 可以保证代码在一段时间内只被执行一次。

+ (FWSDKContext *)sharedContext

{

static FWSDKContext *sharedInstance = nil;

static dispatch_once_t predicate;

dispatch_once(&predicate, ^{

sharedInstance = [[self alloc] init];

});

return sharedInstance;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐