GCD

概念不多说,直接上代码。话说也不是什么高深的东东,不过极大简化了代码,一目了然。后面对信号量的记录也采用了相同的原理。

//抛出线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSURL * url = [NSURL URLWithString:@"http://www.google.com"];
NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
if (data != nil) {
//抛出的线程执行完后,回到主线程处理界面逻辑。
dispatch_async(dispatch_get_main_queue(), ^{ });
} else { }
});

semaphore(信号量)

信号量主要是用在传说中的生产者消费者模式里面,当信号量为0时线程挂起,当信号量大于0时继续向下执行。以前研究过一次,不过没怎么搞懂,反而把界面给搞死了。这次,取相册里的图片,GCD加Semaphore,又折腾了一次,还好。不多说,继续上代码。

//这几段代码的大概意思是:抛一个线程出来,取相册里的group,再在取group中的线程中抛出线程,去取group中的result,最终到界面线程中去操作。
//这里需要两个信号量,一个用来阻塞取group的线程,避免界面线程先于取group的线程运行完毕。另外一个用来阻塞取result中的线程,避免取result的
//线程先于取group执行完毕。 //抛出线程
dispatch_async(dispatch_get_global_queue(0, 0), ^{ //创建信号量
dispatch_semaphore_t semaphore1 = dispatch_semaphore_create(0);
dispatch_semaphore_t semaphore2 = dispatch_semaphore_create(0);
ALAssetsGroupEnumerationResultsBlock groupEnumerAtion = ^(ALAsset *result, NSUInteger index, BOOL *stop){ if (result == nil) {
//当某个group取完毕后,信号量加1,dispatch_semaphore_wait方法执行,信号量为0,程序循环,去取下一个group中的result
dispatch_semaphore_signal(semaphore2); }else if ([[result valueForProperty:ALAssetPropertyType]isEqualToString:ALAssetTypePhoto]||[[result valueForProperty:ALAssetPropertyType]
isEqualToString:ALAssetTypeVideo]) { FileNode *node = [[FileNode alloc] init];
node.m_name = result.defaultRepresentation.filename;
node.m_path = [result.defaultRepresentation.url absoluteString];
[self.picList addObject:node];
NSLog(@"%@",node.m_name);
NSLog(@"%@",node.m_path);
[node release]; }
}; ALAssetsLibraryGroupsEnumerationResultsBlock libraryGroupsEnumeration = ^(ALAssetsGroup* group, BOOL* stop){ if (group!=nil)
{ [group enumerateAssetsUsingBlock:groupEnumerAtion];
dispatch_semaphore_wait(semaphore2, DISPATCH_TIME_FOREVER); }else{
//当所有group取完后,信号量加1,程序不再阻塞,进入界面线程。
dispatch_semaphore_signal(semaphore1);
} }; ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *error){ NSLog(@"failureblock:%@",error);
}; ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:libraryGroupsEnumeration
failureBlock:failureblock]; dispatch_semaphore_wait(semaphore1, DISPATCH_TIME_FOREVER);
dispatch_release(semaphore1);
dispatch_release(semaphore2);
dispatch_async(dispatch_get_main_queue(), ^{ [self loadPicAtPage:self.currentPage];
[self loadPicAtPage:self.currentPage + 1];
});
});

GCD和信号量的更多相关文章

  1. GCD之信号量机制二

    在前面GCD之信号量机制一中介绍了通过信号量设置并行最大线程数,依此信号量还可以防止多线程访问公有变量时数据有误,下面的代码能说明. 1.下面是不采用信号量修改公有变量的值 1 2 3 4 5 6 7 ...

  2. GCD之信号量机制一

    在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它 ...

  3. 用GCD线程组与GCD信号量将异步线程转换为同步线程

    有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了. #impo ...

  4. iOS GCD之dispatch_semaphore(信号量)

    前言 最近在看AFNetworking3.0源码时,注意到在 AFURLSessionManager.m 里面的 tasksForKeyPath: 方法 (L681),dispatch_semapho ...

  5. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

  6. GCD-两个网络请求同步问题

    在网络请求的时候有时有这种需求 两个接口请求数据,然后我们才能做最后的数据处理.但是因为网络请求是移步的 .我们并不知道什么时候两个请求完成 . 通常面对这样的需求会自然的想到 多线程 啊 .表现真正 ...

  7. GCD使用dispatch_semaphore_t创建多线程网络同步请求

    一.简介: dispatch_semaphore_t:表示信号,生成信号的方法是 dispatch_semaphore_t semaphore= dispatch_semaphore_create(0 ...

  8. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  9. iOS开发系列--并行开发其实很容易

    --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...

随机推荐

  1. luogu2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

    ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  2. 使用 SceneLoader 类在 XNA 中显示载入屏幕(十)

    平方已经开发了一些 Windows Phone 上的一些游戏,算不上什么技术大牛.在这里分享一下经验,仅为了和各位朋友交流经验.平方会逐步将自己编写的类上传到托管项目中,没有什么好名字,就叫 WPXN ...

  3. BugKu 2B+基于python的opencv的安装-------CTF 盲水印的套路

    BugKu杂项-2B 下载图片后,binwalk下跑一跑,发现有个zip,分离. 值得一提的是,这个zip是伪加密的. 但是你在分离的时候,伪加密的图片也给你分离出来了.这两个图片2B和B2肉眼看起来 ...

  4. Mac OS使用brew安装memcached

    1.查看安装信息 brew info memcached 显示如下: memcached: stable 1.5.9 (bottled) High performance, distributed m ...

  5. Hadoop架构的初略总结(2)

    Hadoop架构的初略总结(2) 回顾一下前文,我们总结了以下几个方面.我们为什么需要Hadoop:Hadoop2.0生态系统的构成:Hadoop1.0中HDFS和MapReduce的结构模型. 我们 ...

  6. [oldboy-django][3作业汇总]相亲网

    1 相亲网需求 1相亲网需求 a.登录, 基于session, 装饰器 b.数据库表: 男生表 id, username, password 女生表 id, username, password 约会 ...

  7. 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树

    已知 中序&后序  建立二叉树: SDUT 1489 Description  已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input  输入数据有多组,第一行是一个整数t (t& ...

  8. var和function定义方法的区别

    在JS中有两种定义函数的方式,1是var aaa=function(){...}2是function aaa(){...}var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,然后调用.fu ...

  9. ftp下出现“当前的安全设置不允许从该位置下载文件”提示

    在资源管理器中使用ftp协议下载文件时,提示“当前的安全设置不允许从该位置下载文件”,下载失败. 解决方法: 1.在自己的电脑上打开Internet选项

  10. 编程风格——代码中特殊的注释技术——TODO、FIXME和XXX的用处

    代码中特殊的注释技术——TODO.FIXME和XXX的用处 前言:今天在阅读Qt Creator的源代码时,发现一些注释中有FIXME英文单词,用英文词典居然查不到其意义!实际上,在阅读一些开源代码时 ...