• CD多线程的使用(三)


            关于Main Dispatch Queue和Global Dispatch Queue。

            上一篇说了创建Dispatch Queue的方法,其实不用dispatch_queue_create函数也可以获取Dispatch Queue,那就是Main Dispatch Queue 和 Global Dispatch Queue。

            顾名思义,Main Dispatch Queue是在主线程中执行的Dispatch Queue,主线程只能有一个,所以Main Dispatch Queue是一个串行的Dispatch Queue,即Serial Dispatch Queue。

            所有追加到Main Dispatch Queue中的处理都是在RunLoop中执行。由于是在主线程中执行,所以要将用户界面的更新等一些必须在主线程中执行的处理追加到Main Dispatch Queue中使用。这和NSObject类的performSelectorOnMainThread实例方法相似。

            Global Dispatch Queue是Concurrent Dispatch Queue。没有必要用dispatch_queue_create函数逐个生成Concurrent Dispatch Queue,只要获取Global Dispatch Queue就可以了。Global Dispatch Queue有四个执行优先级,分别是高优先级(High Priority)、默认优先级(Default Priority)、低优先级(Low Priority)和后台优先级(Background Priority)。

            获取Main Dispatch Queue的方法如下:

    /**
     *  获取Main Dispatch Queue
     */
    - (void)getMainDispatchQueue {
        dispatch_queue_t mainQueue = dispatch_get_main_queue();
        
        dispatch_async(mainQueue, ^{
            NSLog(@"%@: mainQueue  is main thread:%i", [NSThread currentThread], [NSThread isMainThread]);
        });
    }

            输出结果:

    2015-06-16 20:51:48.710 GCD_Study[19270:607] {name = (null), num = 1}: mainQueue  is main thread:1

            dispatch_get_main_queue函数就是获取Main Dispatch Queue的方法。另外,切记往Main Dispatch Queue中追加任务要用dispatch_async函数,因为dispatch_sync函数在追加任务时,在指定的任务执行结束前该函数是不会返回的,所以如果用dispatch_sync函数往Main Dispatch Queue中追加任务,会导致程序死锁。

            dispatch_get_main_queue函数的定义如下:

    /*!
     * @function dispatch_get_main_queue
     *
     * @abstract
     * Returns the default queue that is bound to the main thread.
     *
     * @discussion
     * In order to invoke blocks submitted to the main queue, the application must
     * call dispatch_main(), NSApplicationMain(), or use a CFRunLoop on the main
     * thread.
     *
     * @result
     * Returns the main queue. This queue is created automatically on behalf of
     * the main thread before main() is called.
     */
     __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
    DISPATCH_EXPORT struct dispatch_queue_s _dispatch_main_q;
     #define dispatch_get_main_queue() 
            DISPATCH_GLOBAL_OBJECT(dispatch_queue_t, _dispatch_main_q)

            获取Global Dispatch Queue的方法如下:

    /**
     *  获取四个优先级的Global Dispatch Queue
     */
    - (void) getGlobalDispatchQueue {
        //高优先级  DISPATCH_QUEUE_PRIORITY_HIGH
        dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
        
        //默认优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT
        dispatch_queue_t defaultPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        //低优先级 DISPATCH_QUEUE_PRIORITY_LOW
        dispatch_queue_t lowPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        
        //后台优先级 DISPATCH_QUEUE_PRIORITY_BACKGROUND
        dispatch_queue_t backgroundPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    }

            dispatch_get_global_queue需要传递两个参数,第一个是指定获得的优先级,第二个是一个flogs值,源码中是这样定义的:

    /*!
     * @function dispatch_get_global_queue
     *
     * @abstract
     * Returns a well-known global concurrent queue of a given priority level.
     *
     * @discussion
     * The well-known global concurrent queues may not be modified. Calls to
     * dispatch_suspend(), dispatch_resume(), dispatch_set_context(), etc., will
     * have no effect when used with queues returned by this function.
     *
     * @param priority
     * A priority defined in dispatch_queue_priority_t
     *
     * @param flags
     * Reserved for future use. Passing any value other than zero may result in
     * a NULL return value.
     *
     * @result
     * Returns the requested global queue.
     */
    __OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
    DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW
    dispatch_queue_t
    dispatch_get_global_queue(dispatch_queue_priority_t priority,
            unsigned long flags);

            flags是保留着以后用的,现在只能传0,传任何大于零的值只能返回一个NULL。

            另外,对于Main Dispatch Queue和Global Dispatch Queue执行dispatch_retain或者dispatch_release是不会引起变化的,也不会有任何问题。

  • 相关阅读:
    (vue.js)vue中怎么设置select默认选中
    owin搭载静态网页
    Vue在IE11下不兼容,最后问题竟然出现在ie的缓存上
    setTimeout或者setInterval传递参数的解决办法
    jquery 发送post请求访问webapi,无法接到参数
    64位进程和32位进程通信问题,接收端收不到 SendMessage发送的消息
    关于C#设置Form的visible属性隐藏问题
    微信 支付支付授权目录 修改
    微信支付(20140923更新)商户支付密钥key的生成与设置
    申请微信公众平台是服务号,营业执照是个体工商户,没有对公账户,能申请微信支付功能吗?
  • 原文地址:https://www.cnblogs.com/arthas/p/4657990.html
Copyright © 2020-2023  润新知