十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
使用GCD开发的基本思路
成都创新互联公司-专业网站定制、快速模板网站建设、高性价比宝塔网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式宝塔网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖宝塔地区。费用合理售后完善,十余年实体公司更值得信赖。基本思想:将任务(操作)放在队列中去执行
任务使用block定义
队列负责调度任务执行所在的线程以及具体的执行时间
队列的特点是先进先出(FIFO)的,新添加至队列的操作都会排在队尾.
GCD的函数都是以dispatch开头的
注意 :队列不是线程,也不对应CPU。
队列:dispatch_queue_t
两种队列:串行队列、并行队列
队列上的操作:添加任务
两种任务:同步任务、异步任务
队列及任务
GCD的串行队列,意味着队列中的任务排队执行
1)添加异步任务:创建一个线程,所有被添加的任务排队执行
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL); for ( int i=0; i<10; i++) { dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); }); }
2)添加同步任务:不创建线程,任务在当前线程中执行,极少使用
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_SERIAL); dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
CGD并行队列,意味着队列中任务不会排队执行,随机执行
1)添加异步任务:会创建线程,个数不确定,任务的先后顺序不确定
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT); dispatch_async(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
2)添加同步任务:不会创建线程,极少使用
dispatch_queue_t q = dispatch_queue_create("teacherAn", DISPATCH_QUEUE_CONCURRENT); dispatch_sync(q, ^{ NSLog(@"%@ %d", [NSThread currentThread], i); });
无论什么队列和什么任务,线程的创建和回收都不需要程序员参与,线程的创建和回收是由队列负责的
全局队列
GCD的最常用队列是全局队列和主队列,这两种队列不需要创建,是每个App都具有的
获得全局队列
dispatch_queue_t dispatch_get_global_queue( long identifier, unsigned long flags);
flags参数:保留参数,传0即可
identifier参数:用于指定使用哪种全局队列
四种全局队列:
#define DISPATCH_QUEUE_PRIORITY_HIGH 2 //高优先级
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0 //默认优先级
#define DISPATCH_QUEUE_PRIORITY_LOW (-2) //低优先级
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //最低的后台优先级
全局队列是系统的,拿过来直接用即可,都是并行队列
添加异步任务,会创建多个线程,任务无须执行
添加同步任务,不会创建新线程,任务排序执行
主队列
每一个应用程序都只有一个主线程,在iOS开发中,所有UI的更新操作,都必须在主线程中去做
获得主队列:
dispatch_queue_t dispatch_get_main_queue(void);
主队列也是系统的,拿过来直接用即可,添加的任务都会在主线程终止hi性
添加异步任务:在主线程中顺序执行,无异步效果
添加同步任务:任务不会执行
常见的用法:
如果一个任务想要在后台(子线程)执行,则使用全局队列添加异步任务
如果一个任务想要在主线程执行,则使用主队列添加同步任务
异步下载图片
这是一类最常见的做法,在子线程中请求数据,完成后回到主线程中更新相关的UI元素
GCD的一些其他常用操作
1)任务的延迟执行
dispatch_after函数会延迟将一个block任务添加到队列中
void dispatch_after( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);
在Xcode中,通过快捷键补全的代码:
delayInSeconds:延迟的秒数
使用的主队列,即延迟的任务在主线程中执行
最后的block,即任务代码
2)任务的多次执行
dispatch_apply函数将一个任务放到队列中多次执行
具体是串行执行还是并行执行是由具体的队列决定。
dispatch_apply不会立刻返回,在执行完毕后才返回,是同步的调用
void dispatch_apply( size_t iterations, dispatch_queue_t queue, void (^block)( size_t));
iteractions:执行的次数
queue:队列,一般使用全局队列
block:任务代码
应用场景:将关系不紧密的循环操作放到后台运行
3)保证任务只执行一次
在多线程的环境下,同故宫dispatch_once()保证一个任务只会执行一次
在Xcode中,通过快捷键补全的代码:
在block中添加任务代码即可
应用场景:单例对象的创建
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。