美文网首页
iOS中的网络和多线程编程(五)

iOS中的网络和多线程编程(五)

作者: anny_4243 | 来源:发表于2022-02-16 11:01 被阅读0次

    摘自《iOS程序员面试笔试宝典》

    用户下载一个大图片,分成很多份下载,如何使用GCD实现

    使用Dispatch Group追加block到Global GroupQueue,这些block如果全部执行完毕,那么就会执行通过dispatch_group_notify添加到主队列中的block,进行图片的合并处理。

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, queue, ^{
        /*加载图片1*/
    });
    dispatch_group_async(group, queue, ^{
            /*加载图片2*/
        });
    dispatch_group_async(group, queue, ^{
          /*加载图片3*/
    });
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        // 合并图片......
    });
    

    项目中什么时候选择使用GCD?什么时候选择NSOperation

    NSOperation是对线程的高度抽象,提供Objective-C语言接口,具备面向对象特性(复用、封装),可子类化NSOperation进行操作对象的复用,使程序逻辑结构更清晰。比起GCD,NSOperation可以直接设置操作之间的依赖关系实现线程同步,而且可以通过调用cancel方法中途取消操作,而在GCD中不可取消。NSOperation的线程逻辑控制更加精细灵活,同时复杂度较GCD要高,因此建议在有特殊需求的复杂项目中使用。

    GCD的最大优点是非常简单、易用,经过了官方的优化更加安全高效(多数函数是线程安全的)。对于不复杂的多线程操作,会节省代码量,尤其block参数的使用,使代码更为易读,建议在简单项目中广泛使用。

    NSOperation和GCD的特点

    NSOpertion如何实现线程依赖

    对于a、b、c 3个线程,如何使用NSOpertion和NSOpertionQueue实现执行完a和b后再执行c的结果?

    对于上述问题,其实可以通过NSOpertion的依赖特性实现,即让c依赖于a和b,这样只有a和b都执行完后,c才可以开始执行。

    /*获取主队列(主线程)*/
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    /*创建a、b、c操作*/
    NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"Operation A Start!");
        [NSThread sleepForTimeInterval:3.0];
        NSLog(@"Operation A Done!");
    }];
        
    NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"Operation B Start!");
        [NSThread sleepForTimeInterval:3.0];
        NSLog(@"Operation B Done!");
    }];
        
    NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"Operation C Start!");
        //... ...
    }];
        
    /*添加操作依赖,c依赖于a和b*/
    [c addDependency:a];
    [c addDependency:b];
    /*添加操作a、b、c到操作队列queue(特意将c在a和b之前添加)*/
    [queue addOperation:c];
    [queue addOperation:a];
    [queue addOperation:b];
    

    程序的输出结果为:

    相关文章

      网友评论

          本文标题:iOS中的网络和多线程编程(五)

          本文链接:https://www.haomeiwen.com/subject/hrwjlrtx.html