当前位置: 移动技术网 > 移动技术>移动开发>IOS > IOS开发(50)之GCD的一些小应用

IOS开发(50)之GCD的一些小应用

2019年05月12日  | 移动技术网移动技术  | 我要评论

>>>>>>>>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中显示为例。

    //显示loading
    self.indicator.hidden = no;
    [self.indicator startanimating];
    //进入异步线程
    dispatch_async(dispatch_get_global_queue(dispatch_queue_priority_default, 0), ^{
        //异步下载图片
        nsurl * url = [nsurl urlwithstring:@"https://animageurl"];
        nsdata * data = [nsdata datawithcontentsofurl:url];
        //网络请求之后进入主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            //关闭loading
            [self.indicator stopanimating];
            self.indicator.hidden = yes;
            if (data) {//显示图片
                self.imageview.image = [uiimage imagewithdata:data];
            }
        });
    });
这样利用gcd可以把关于一个任务的代码都放在一起。而不是像采用第一种方法一样代码到处散落。

 

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

// 延迟2秒执行:
    double delayinseconds = 2.0;
    dispatch_time_t poptime = dispatch_time(dispatch_time_now, delayinseconds * nsec_per_sec);
    dispatch_after(poptime, dispatch_get_main_queue(), ^(void){
        // code to be executed on the main queue after delay
    });


>>>>>>> 创建自己的queue

dispatch_queue_t custom_queue = dispatch_queue_create(“customqueue”, null);
    dispatch_async(custom_queue, ^{
        //doing something in custom_queue
    });
    dispatch_release(custom_queue);


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

    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
        // 并行执行的线程一
    });
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
        // 并行执行的线程二
    });
    dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
        // 汇总结果
    });

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网