多线程知识巩固(七) 多线程安全读写

  1. Dispatch Group
    在追加到Dispatch Queue中的多个任务处理完毕之后想执行结束处理,这种需求会经常出现。如果只是使用一个Serial Dispatch Queue(串行队列)时,只要将想执行的处理全部追加到该串行队列中并在最后追加结束处理即可,但是在使用Concurrent Queue 时,可能会同时使用多个Dispatch Queue时,源代码就会变得很复杂。

    在这种情况下,就可以使用Dispatch Group。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    dispatch_group_t group = dispatch_group_create();
         dispatch_queue_t queue = dispatch_queue_create( "com.gcd-group.www" , DISPATCH_QUEUE_CONCURRENT);
         
         dispatch_group_async(group, queue, ^{
             for  ( int  i = 0; i < 1000; i++) {
                 if  (i == 999) {
                     NSLog (@ "11111111" );
                 }
             }
             
         });
         
         dispatch_group_async(group, queue, ^{
             NSLog (@ "22222222" );
         });
         
         dispatch_group_async(group, queue, ^{
             NSLog (@ "33333333" );
         });
         
         dispatch_group_notify(group, queue, ^{
             NSLog (@ "done" );
         });

    控制台的输出:


    因为向Concurrent Dispatch Queue 追加处理,多个线程并行执行,所以追加处理的执行顺序不定。执行顺序会发生变化,但是此执行结果的done一定是最后输出的。

    无论向什么样的Dispatch Queue中追加处理,使用Dispatch Group都可以监视这些处理执行的结果。一旦检测到所有处理执行结束,就可以将结束的处理追加到Dispatch Queue中,这就是使用Dispatch Group的原因。

    下面试一个使用Dispatch Group异步下载两张图片,然后合并成一张图片的medo(注意,我们总是应该在主线程中更新UI):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #import "ViewController.h"
     
    @interface  ViewController ()
    @property  ( nonatomic , strong) UIImage *imageOne;
    @property  ( nonatomic , strong) UIImage *imageTwo;
    @property  ( nonatomic , weak) UILabel *textLabel;
    @end
     
    @implementation  ViewController
     
    - ( void )viewDidLoad {
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值