GCD同步问题

现在许多iOS初学者在图片加载请求一块总是依赖第三方插件,表面上我们是省去了很多工作,但是遇到一点问题,可能我们花了10倍的时间去钻牛角尖,本人在iOS这一块,主力推荐在苹果框架的基础上做一些封装,这样的东西可能是我们更喜欢的东西,她完全可以胜任目前的许多工作,而且你的能力会比用三方库成长很多,孩子先学会自立,再学者去善假于物也。

回归正题,iOS这一块多线程我们一般采用GCD,但用了GCD时,我们往往忘了与主线程同步,图片总是等很久才刷出来,代码来看一下。


 1  NSString *fileMD5Name = [EncryptionUtils getMd5_16Bit_String:leftTeacherItem.imgUrl];
2 NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp"];
3 __block NSData *data = [NSData dataWithContentsOfFile:[filePath stringByAppendingPathComponent:fileMD5Name]];
4
5 if(data){
6 cell.leftTeacherSingleView.imgvwIco.image = [UIImage imageWithData:data];
7 }
8 else{
9 if(tableView.dragging==NO&&tableView.decelerating==NO){
10 dispatch_async(dispatch_get_global_queue(0, 0), ^{
11 data = [NSData dataWithContentsOfURL:[NSURL URLWithString:leftTeacherItem.imgUrl]];
12 if(data){
13 [data writeToFile:[filePath stringByAppendingPathComponent:fileMD5Name] atomically:YES];
              //this async main
14 dispatch_async(dispatch_get_main_queue(), ^{
15 cell.leftTeacherSingleView.imgvwIco.image = [UIImage imageWithData:data];
16 });
17
18 }
19 else{
20 //loading default img
21 cell.leftTeacherSingleView.imgvwIco.image = [UIImage imageNamed:@""];
22 }
23 });
24 }
25 else{
26 //loading default img
27 }
28 }

GCD同步问题,布布扣,bubuko.com

时间: 2024-10-08 09:59:19

GCD同步问题的相关文章

GCD5: 用GCD同步执行非UI相关的任务

讨论: 当执行那些与 UI 无关的任务,或者与 UI 交互的任务时,和执行其他任务一样,会需要大量时间,以上情况会经常出现.例如,你想下载一个图片并想在下载完成之后展现给用户.下载过程却和 UI 没有任何关系. 对于任何与 UI 无关的任务,你可以使用 GCD 中的全局并发队列.它们允许同步和异步执行. 如果你同步提交一个任务到一个并发队列,同时提交另一个同步任务到另一个并发队列;相对而言这两个同步任务将异步运行,因为他们运行在两个不同的并发队列上.理解这一点很重要,正如我们将看到的那样,你想确

iOS GCD, 同步,异步,串行队列,并行队列,dispatch_group

同步,指代码在同一个线程运行 异步,代码在另一个线程运行 串行队列,提交到该队列的block会顺序执行 并行队列,提交到该队列的block会并发执行 如果想等某一队列中所有block都执行完了在执行一个操作,在串行队列中,可以把最后需要执行的block放在队列最后即可,但是在并行队列中,可以用dispatch_group,最后通过dispatch_group_notify来执行最后要执行的block. 待编辑,补充例子.

如何用GCD同步若干个异步调用

必须是并发队列才起作用 需求分析 首先,分别异步执行2个耗时的操作 其次,等2个异步操作都执行完毕后,再回到主线程执行一些操作 使用队列组实现上面的需求 // 创建队列组 dispatch_group_t group = dispatch_group_create(); // 获取全局并发队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 往队列组中添加耗时操作

《GCD 实现同步锁》-07-多线程

@MicroCai 2015-03-03 23:18 字数 6539 阅读 202 Effective Objective-C Notes:GCD 实现同步锁 Archives iOS <Effective Objective-C Notes>系列博文整理自<Effective Objective-C 2.0> 如果您觉得我的博客对您有帮助,请通过关注我的新浪微博  MicroCai 支持我,谢谢! 本文名为<GCD 实现同步锁>,内容不止于锁.文章试图通过 GCD 同

GCD那些事儿

GCD GCD,全名Grand Central Dispatch,中文名郭草地,是基于C语言的一套多线程开发API,一听名字就是个狠角色,也是目前苹果官方推荐的多线程开发方式.可以说是使用方便,又不失逼格.总体来说,他解决我提到的上面直接操作线程带来的难题,它自动帮你管理了线程的生命周期以及任务的执行规则.下面我们会频繁的说道一个词,那就是任务,说白了,任务其实就是你要执行的那段代码. 任务管理方式--队列 上面说当我们要管理多个任务时,线程开发给我们带来了一定的技术难度,或者说不方便性,GCD

NSURLConnection同步和异步连接

NSURLConnection去加载一个URL请求时候有两种方式,一种是同步加载,一种是异步加载. 同步加载会阻塞当前的那个线程,如果将同步加载的代码放在主线程里去执行,那么就会阻塞主线程. 异步加载一种方式使用的是block,就算将加载的代码放到主线程去执行,也不会阻塞主线程.异步加载的另一种方式比较灵活.它可以在你需要的时候去启动,在你不需要的时候可以取消. 先看一个在主线程种同步和异步,以及使用GCD同步三种方式加载数据的阻塞情况 // // AppDelegate.m // NSURLC

iOS进阶面试题

1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ // https://github.com/ChenYilong // 修改完的代码,这是第一种修改方法,后面会给出第二种修改方法 typedef NS_ENUM(NSInteger, CYLSex) { CYLSexMan, CYLSexWoman }; @interface CYLUser : NSObject<NSCopying

iOS开发--四种多线程技术方案

iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { NSLog(@"---buttonclick---%zd---%@", i, [NSThread currentThread]); } return NULL; } @implementation ViewController - (IBAction)clickBut

iOS开发——面试篇&amp;面试总结(二)

面试总结(二) 1. 风格纠错题 修改方法有很多种,现给出一种做示例: 下面对具体修改的地方,分两部分做下介绍:硬伤部分和优化部分 .因为硬伤部分没什么技术含量,为了节省大家时间,放在后面讲,大神请直接看优化部分. 优化部分 1)enum建议使用 NS_ENUM 和 NS_OPTIONS 宏来定义枚举类型,参见官方的 Adopting Modern Objective-C 一文: 1 2 3 4 5 //定义一个枚举 typedef NS_ENUM(NSInteger, CYLSex) {