zoukankan      html  css  js  c++  java
  • GCD的一些小应用

    >>>>>>>>iOS中的多线程有以下几个办法
    1.performSelector(InBackground or MainThread)
    这个方法比较方便,但是问题在于参数传递只能支持一个对象(传多个参数,我是将其打包在一个NSDictionary里面)
    2.NSOperationQueue
    这个方法稍微复杂,提供了每个任务的封装(NSOperation)。可以继承NSOperation之后,在main函数中写一些同步执行的代码,然后放到一个Queue之中,Queue自动管理Operation的执行和调度(在UI线程以外)。对于异步执行的代码,需要重载NSOperation的好几个函数才能正常工作(告诉Queue关于这个任务的进度以及执行情况)。
    3.NSThread
    这种方法我还没有研究过,不过直觉会比较复杂。
    4.GCD
    在UI线程和其它线程之间切换很方便,我喜欢的方式是和NSOperationQueue搭配使用。本文着重介绍这个方法。

    5,pthread

    >>>>>>>>GCD的使用方法
    以点击一个按钮,然后显示loading,同时在后台下载一张图片,最后将下载的图片放到UIImageView中显示为例。

    1.     //显示loading
    2.     self.indicator.hidden = NO;
    3.     [self.indicator startAnimating];
    4.     //进入异步线程
    5.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    6.         //异步下载图片
    7.         NSURL * url = [NSURL URLWithString:@"http://anImageUrl"];
    8.         NSData * data = [NSData dataWithContentsOfURL:url];
    9.         //网络请求之后进入主线程
    10.         dispatch_async(dispatch_get_main_queue(), ^{
    11.             //关闭loading
    12.             [self.indicator stopAnimating];
    13.             self.indicator.hidden = YES;
    14.             if (data) {//显示图片
    15.                 self.imageView.image = [UIImage imageWithData:data];
    16.             }
    17.         });
    18.     });

    这样利用GCD可以把关于一个任务的代码都放在一起。而不是像采用第一种方法一样代码到处散落。



    >>>>>>> 利用GCD延迟执行任务的方法

    1. // 延迟2秒执行:
    2.     double delayInSeconds = 2.0;
    3.     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    4.     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    5.         // code to be executed on the main queue after delay
    6.     });



    >>>>>>> 创建自己的Queue

    1. dispatch_queue_t custom_queue = dispatch_queue_create(“customQueue”, NULL);
    2.     dispatch_async(custom_queue, ^{
    3.         //doing something in custom_queue
    4.     });
    5.     dispatch_release(custom_queue);



    >>>>>>> 利用GCD并行多个线程并且等待所有线程结束之后再执行其它任务

    1.     dispatch_group_t group = dispatch_group_create();
    2.     dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
    3.         // 并行执行的线程一
    4.     });
    5.     dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
    6.         // 并行执行的线程二
    7.     });
    8.     dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
    9.         // 汇总结果
    10.     });
    更多0
     
  • 相关阅读:
    Understand Rails Authenticity Token
    正则表达式:数值及数值型字符串三位一组格式化
    ceph主要数据结构解析2-Rados.h文件
    遍历聚合对象中的元素——迭代器模式(三)
    ceph主要数据结构解析3-Ceph_fs.h文件
    linux crontab 定时命令
    mysql数据类型详解
    遍历聚合对象中的元素——迭代器模式(四)
    Eclipse自动插件依赖的一种配置解决方式
    php缓存小技巧
  • 原文地址:https://www.cnblogs.com/BinShao/p/3561301.html
Copyright © 2011-2022 走看看