iOS multithreading gcd detailed

Source: Internet
Author: User
Tags gcd
<span id="Label3"></p><p><p><span style="font-size: 16px; color: #3366ff;">Today we are here to learn about GCD</span></p></p>1. What is gcd?<p><p>GCD full name Grand Central Dispatch, our popular translation is called the Center Dispatch.</p></p>2. What do we do with gcd?<p><p>With GCD, developers no longer have to deal directly with threads, just add code blocks to the queue, and GCD manages a thread pool on the Backend. GCD not only determines which thread your code block will be executed on, It also manages these threads based on available system Resources. This frees the developer from the work of thread management and mitigates the problem of a large number of threads being created through a centralized management thread.</p></p><p><p>Another important change that GCD brings is that as developers can consider work as a queue rather than a bunch of threads, this parallel abstraction model is easier to master and Use.</p></p><p><p>first, the system provides you with a special queue called the home row (main queue). As with other serial queues, the tasks in this queue can only execute one at a Time. however, it ensures that all tasks are performed on the main thread, and that the main thread is the only one that can be used to update the UI. This queue is used for messages to UIView or to send Notifications.</p></p><p><p>The system also provides you with several concurrent Queues. They are called global dispatch queues (Dispatch Queues). The current four global queues have different priorities: background, low, default, and High. You know, Apple's API also uses these queues, so any tasks you add won't be the only tasks in those Queues.</p></p><p><p>finally, You can also create your own serial or concurrent Queues. This means that at least five queues are at your disposal: the primary queue, the four global dispatch queue, plus any queues you create yourself.</p></p>What are the advantages of 3.GCD compared to other multithreading? <ul> <ul> <li>GCD can improve the responsiveness of your application by deferring expensive computing tasks and running them in the Background.</li> <li>GCD provides an easy-to-use concurrency model, not just locks and threads, to help us avoid concurrency traps.</li> <li>GCD has the potential to optimize your code with higher performance primitives in common patterns, such as Singleton.</li> <li>GCD will automatically take advantage of more CPU cores (such as dual-core, quad-core)</li> </ul> </ul>4.GCD terminology <ul> <ul> <li>Serial (Serial): Let the task execute one after the other (once a task is completed, the next task is Performed)</li> <li>Concurrency (Concurrent): You can have multiple tasks concurrently (concurrently) execute (automatically turn on multiple threads concurrently executing tasks) concurrency is only valid under asynchronous (dispatch_async) Functions.</li> <li>Synchronous (synchronous): performs a task in the current thread without the ability to open a new thread</li> <li>Asynchronous (asynchronous): performs a task in a new thread with the ability to open a new thread</li> </ul> </ul>5. Using GCD<p><p>1. Know the home row, feel the serial queue running, the results of the operation is printed 1,2,3,4, sequential Execution.</p></p><pre>dispatch_queue_t Mainqueue =<span style="color: #000000;"><span style="color: #000000;">dispatch_get_main_queue ();d ispatch_async (mainqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">1</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_async (mainqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">2</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_async (mainqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">3</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_async (mainqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">4</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);});</span></span></pre><p><p>2. Recognize the global queue, experience the operation of the concurrent queue, run the results randomly print: 2,3,1,4, random execution.</p></p><pre>dispatch_queue_t defaultqueue = Dispatch_get_global_queue (dispatch_queue_priority_default,<span style="color: #800080;"><span style="color: #800080;">0</span></span><span style="color: #000000;"><span style="color: #000000;">);d Ispatch_async (defaultqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">1</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_async (defaultqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">2</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_async (defaultqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">3</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_async (defaultqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">4</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);});</span></span></pre><p><p>3. Create a custom queue</p></p><pre>dispatch_queue_t Concurrentqueue = Dispatch_queue_create (<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">Com.bjsxt.concurrentQueue</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">, dispatch_queue_concurrent); Dispatch_async (concurrentqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">4</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">); Dispatch_sync (concurrentqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{[nsthread sleepfortimeinterval:</span></span><span style="color: #800080;"><span style="color: #800080;">3</span></span><span style="color: #000000;"><span style="color: #000000;">]; NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">5</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">); }); NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">6</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);});</span></span></pre><p><p>The application of 4.GCD in single case dispatch_once</p></p><pre><pre><span style="color: #0000ff;">Static</span> <span style="color: #000000;">dispatch_once_t oncetoken;dispatch_once (</span>&oncetoken, ^<span style="color: #000000;">{ NSLog (</span><span style="color: #800000;">@ "</span><span style="color: #800000;">oncetoken </span><span style="color: #800000;">"</span><span style="color: #000000;">);});</span></pre></pre><p><p>5. Lazy Loading Dispatch_after</p></p><pre><pre><span style="color: #0000ff;">Double</span> <span style="color: #800080;">2.0</span> <span style="color: #000000;"></span> =<span style="color: #000000;"></span>= dispatch_time (dispatch_time_now,delayinseconds *<span style="color: #000000;"></span>^<span style="color: #000000;">{ NSLog (</span><span style="color: #800000;">@ "</span> ) <span style="color: #800000;">2 seconds of delayed execution</span> <span style="color: #800000;">"</span> <span style="color: #000000;">);});</span></pre></pre><p><p>6. Dispatch Group dispatch_group_t</p></p><pre>dispatch_group_t Group =<span style="color: #000000;"><span style="color: #000000;">dispatch_group_create ();d ispatch_queue_t defaultqueue</span></span>= Dispatch_get_global_queue (dispatch_queue_priority_default,<span style="color: #800080;"><span style="color: #800080;">0</span></span><span style="color: #000000;"><span style="color: #000000;">);d ispatch_group_async (group, defaultqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{[nsthread sleepfortimeinterval:</span></span><span style="color: #800080;"><span style="color: #800080;">3</span></span><span style="color: #000000;"><span style="color: #000000;">]; NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">1</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_group_async (group, defaultqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{[nsthread sleepfortimeinterval:</span></span><span style="color: #800080;"><span style="color: #800080;">2</span></span><span style="color: #000000;"><span style="color: #000000;">]; NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">2</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_group_notify (group, defaultqueue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">3</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); </span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">equivalent to</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Dispatch_group_enter (group);</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Dispatch_async (defaultqueue, ^{</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">NSLog (@ "1");</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;">Dispatch_group_leave (group);</span></span><span style="color: #008000;"><span style="color: #008000;">//</span></span><span style="color: #008000;"><span style="color: #008000;"> });</span></span></pre><p><p>7.dispatch_barrier_async</p></p><p><p>It does not execute until after the execution of the previous task is completed, and the task after it is executed before it is Finished.</p></p><pre>dispatch_queue_t queue = Dispatch_queue_create (<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">Com.bjsxt.barrierExecute</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">, dispatch_queue_concurrent);d ispatch_async (QUEUE,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{[nsthread sleepfortimeinterval:</span></span><span style="color: #800080;"><span style="color: #800080;">2</span></span><span style="color: #000000;"><span style="color: #000000;">]; NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">1</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_async (queue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{[nsthread sleepfortimeinterval:</span></span><span style="color: #800080;"><span style="color: #800080;">4</span></span><span style="color: #000000;"><span style="color: #000000;">]; NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">2</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);}); Dispatch_barrier_async (queue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">3</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">); [nsthread Sleepfortimeinterval:</span></span><span style="color: #800080;"><span style="color: #800080;">4</span></span><span style="color: #000000;"><span style="color: #000000;">]; });d Ispatch_async (queue,</span></span>^<span style="color: #000000;"><span style="color: #000000;">{[nsthread sleepfortimeinterval:</span></span><span style="color: #800080;"><span style="color: #800080;">1</span></span><span style="color: #000000;"><span style="color: #000000;">]; NSLog (</span></span><span style="color: #800000;"><span style="color: #800000;">@"</span></span><span style="color: #800000;"><span style="color: #800000;">4</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #000000;"><span style="color: #000000;">);});</span></span></pre><p><p>8. Execute a code dispatch_apply</p></p><pre><pre><span style="color: #800080;">0</span> <span style="color: #000000;">); Dispatch_apply (</span><span style="color: #800080;">5</span>, defaultqueue, ^<span style="color: #000000;">(size_t i) { NSLog (</span><span style="color: #800000;">@ "</span><span style="color: #800000;">%lu</span><span style="color: #800000;">"</span> <span style="color: #000000;">, i);});</span></pre></pre><p><p>Reference article:</p></p><p><p>Https://github.com/nixzhu/dev-blog</p></p><p><p>http://objccn.io/issue-2-1/</p></p><p><p>iOS multithreading gcd detailed</p></p></span>
Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.