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. 【NOIP 2017 普及组】 跳房子

    裸的单调队列优化dp+二分 我居然还调了挺久 日常审题错误 #include <bits/stdc++.h> using namespace std; typedef long long ...

  2. 冒泡排序(Bubble Sort)及优化

    原理介绍 冒泡排序算法的原理如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有 ...

  3. DNS(转载)

    最近帮朋友注册域名配置主机,碰到一些DNS上的一些概念,惭愧于有一些东西已经忘记是啥意思,于是决定重新学习一下DNS方面的基本概念. 常用概念: TTL: TTL为Time to live的缩写,网络 ...

  4. POJ 3494 Largest Submatrix of All 1’s 单调队列||单调栈

    POJ 3494 Largest Submatrix of All 1’s Description Given a m-by-n (0,1)-matrix, of all its submatrice ...

  5. 通过TCP实现文件传输

    import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.In ...

  6. cf 843 D Dynamic Shortest Path [最短路+bfs]

    题面: 传送门 思路: 真·动态最短路 但是因为每次只加1 所以可以每一次修改操作的时候使用距离分层的bfs,在O(n)的时间内解决修改 这里要用到一个小技巧: 把每条边(u,v)的边权表示为dis[ ...

  7. Linux系统——常见的系统调用

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  8. 模块(二)——简单的log日志

    简单的log日志 鉴于任何功能模块或系统在调试时都需要日志打印,这里随便写了一下,作为以后代码调试之用,只实现了不同等级的日志输出功能,其他的调试功能以后再行添加:使用方法简单,只需要在头文件里事先按 ...

  9. wooyun

    转自:http://zone.wooyun.org/content/19128 tencent.com baidu.com sina.com.cn sohu.com discuz.net rising ...

  10. 糗事百科python爬虫

    # -*- coding: utf-8 -*- #coding=utf-8 import urllib import urllib2 import re import thread import ti ...