美文网首页
以具体功能为切入点理解iOS中的GCD

以具体功能为切入点理解iOS中的GCD

作者: Jack小麻雀_ | 来源:发表于2020-04-11 09:36 被阅读0次

    说到Grand Central Dispatch,同步异步+串行并发开始的时候搞的我一头雾水。今天以具体的下载图片的例子来跟大家分享我的理解。

    下载图片的功能需求:
    1.不在Main Thread中完成下载图片的任务;
    2.下载任务完成时在Main Thread中展示图片;

    代码如下

    -(void)buttonAction:(UIButton*)sender{
        NSLog(@"主任务A");
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"下载任务");
            //dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)获取并发队列
            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://2f.zol-img.com.cn/product/153/509/ce7f5KSOeEcC6.jpg"]];
            //这里暂停,直到完成下载为止
            dispatch_async(dispatch_get_main_queue(), ^{
                //dispatch_get_main_queue()获取主队列
                [sender setImage:[UIImage imageWithData:imageData] forState:(UIControlStateNormal)];
                NSLog(@"主任务B");
            });
        });
        sender.backgroundColor = [UIColor greenColor];
        NSLog(@"主任务C");
    }
    
    运行结果

    整个的流程大概是这样子的


    任务未开始 任务A 下载任务,在新的Thread中开始下载任务 Main Queue中加入C任务,Main Thread中开始C任务,现有两个thread在工作 Main Queue中加入B任务,Other Thread等待系统回收

    结论:这里便有了两种常用的搭配
    1.async+global_queue:耗时的任务都可以放在里面处理;
    2.async+main_queue:完成任务后回到主线程操作UI;

    相关文章

      网友评论

          本文标题:以具体功能为切入点理解iOS中的GCD

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