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. DevOps实施的三种IT障碍

    [TechTarget中国原创] 现今DevOps可谓是红遍半边天,但正因为它是新的东西,企业也在不停的犯同样的错误.从这些挑战中学习,让你的DevOps项目取得成功. DevOps正在以一种更有效的 ...

  2. Python框架之Django学习笔记(十七)

    Django框架之表单(续二) 今天的这篇博客将是Django学习笔记博客的最后一篇,基本每周最少一篇的Django框架学习,坚持到今天也实属不易,当然了,这个框架的学习仅仅是Django框架的基础部 ...

  3. 图说不为人知的IT传奇故事-1-计算机新生

    此系列文章为“图说不为人知的IT传奇故事”,各位大忙人可以在一分钟甚至几秒内了解把握整个内容,真可谓“大忙人的福利”呀!!希望各位IT界的朋友在钻研技术的同时,也能在文学.历史上有所把握.了解这些故事 ...

  4. ThinkPHP5 连接 PostgreSQL

    $request = Db::connect( [ 'type' => 'pgsql', 'hostname' => '127.0.0.1', 'database' => 'keyw ...

  5. Python_字符串操作

      name='hu\tqihang'                       #\t是TAB键  1.打印相关 print(name.center(50,'-')) #一共打印50个字符,不够的 ...

  6. PHP中create_function的用法总结

    在php中,函数create_function主要用来创建匿名函数,有时候匿名函数可以发挥它的作用. 1.测试一 测试一主要用来循环替换数组中多个值的<与>,我们用array_map加上c ...

  7. File(IO流)

    import java.io.File; import java.io.IOException; import org.junit.Test; /** *java.io.File类 *1.凡是与输入输 ...

  8. [POJ2942][LA3523]Knights of the Round Table

    [POJ2942][LA3523]Knights of the Round Table 试题描述 Being a knight is a very attractive career: searchi ...

  9. [HNOI2014][bzoj3572] 世界树 [虚树+dp]

    题面: 传送门 思路: 一道虚树的好题,是很多虚树博客的入门题目 但是我认为这道题目出的难点和亮点不在于虚树,而在于建出虚树以后dp的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ...

  10. [usaco jan 09] 安全路径 travel [最短路径树]

    题面: 传送门 思路: 既然最后一条边不能走,那么就一定是换了一条路,一条不经过这最后一条边的路 如果想要这条路最短,那么其在路上一定尽可能多地走了最短路径 因此,我们对这张图跑一遍从1开始的单源最短 ...