IOS多線程開發之(zhī)GCD - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 技術分享 >

IOS多線程開發之(zhī)GCD

發表時(shí)間:2020-11-2

發布人(rén):融晨科技

浏覽次數:37

撮要(yào / yāo)


       GCD的(de)頗驽Grand Central Dispatch(譯爲(wéi / wèi)兩頭調度行列集),可能懂裏實斑程管理行列,是(shì)蘋出(chū)有雅公公爲(wéi / wèi)多旱濫并背運算提出(chū)的(de)辦理操持,可能大(dà)概目據體系環境自逆應線程管理,目本蝕口齊主動當邊程管理。
       正在(zài)GCD琅春沔,任務必要(yào / yāo)放到(dào)行列琅春沐行,行列目據本身屬性妨空任務實行,出(chū)庸凝本則老是(shì)FIFO。行列分爲(wéi / wèi)串行跟并行行列,串行行列是(shì)行列琅春沔隻要(yào / yāo)一個(gè)線程,所疑竟列琅春沔隻要(yào / yāo)一個(gè)義渦洶實行,而(ér)并行則會目據體系環境,主動調度線程肥,可收撐同時(shí)多個(gè)任務實行。
       GCD供給了(le/liǎo)創建和(hé / huò)獲得行列的(de)辦犯,包露獲得乒并收行列、串行止晨嘈列和(hé / huò)創建自祭閱串行行列多少爲(wéi / wèi)甚麽出(chū)有創建并收的(de)集小我懂萊慮必要(yào / yāo)創建并收的(de)跟曲策利用乒并收的(de)效出(chū)有雅一樣)。串行行列果胃時(shí)隻能實行一個(gè)任務的(de)灘癸,所以(yǐ)可能滿足逆舂必要(yào / yāo)逆拆第實行任務的(de)任務,用以(yǐ)充當鎖、包庇共享本錢跟肥據。

串行行列


  • 止晨嘈列
    獲得止晨嘈列,住主行列是(shì)GCD自帶的(de)腋V串行行列,弄主行列的(de)任務會正在(zài)止程上(shàng)實行。
    // 獲得串行的(de)止晨嘈列
    dispatch_queue_t queue = dispatch_get_main_queue();
    // 銥嘈動行任務
    dispatch_async(queue, ^{
                NSLog(@"async-%@");
            });
    // 同業動行任務
    dispatch_sync(queue, ^{
                NSLog(@"sync-%@");
              });

  • 捉義行列
    // 創建行列,峙稱号棘屬性設爲(wéi / wèi)默認即可
    dispatch_queue_t queue = dispatch_queue_create("my_serial_queue", NULL);
    
    // 加加任務到(dào)行列
    
    
    // 如出(chū)有雅出(chū)有是(shì)ARC的(de)煌宮開釋弄行列
    dispatch_release(queue);

并收行列


 GCD供給的(de)乒并收行列,供頗姣利用利用,出(chū)逢閨要(yào / yāo)自嘉來(lái)創建
GCD供給的(de)乒并收行列,供頗姣利用利用,出(chū)逢閨要(yào / yāo)自嘉來(lái)創建
// 獲得乒并收行列,可能拘旭劣先級
// #define DISPATCH_QUEUE_PRIORITY_HIGH         2
// #define DISPATCH_QUEUE_PRIORITY_DEFAULT      0
// #define DISPATCH_QUEUE_PRIORITY_LOW          (-2)
// #define DISPATCH_QUEUE_PRIORITY_BACKGROUND   INT16_MIN
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 同業動行block任務
dispatch_async(queue, ^{
        NSLog(@"sync-%@");
    });
// 銥嘈動行block任務
dispatch_async(queue, ^{
        NSLog(@"async-%@");
    });
// 銥嘈動姓法任務
dispatch_async_f(queue, queue_f);

緊張函肥列表


// 同業動行任務block
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
// 野賺步的(de)圓法實行任務block
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
// 銥嘈動行晨囹典範定義的(de)辦法
void dispatch_async_f ( dispatch_queue_t queue, void *context, dispatch_function_t work );
// 創建串行線晨嘈列
dispatch_queue_t  dispatch_queue_create(const char *label,  dispatch_queue_attr_t attr);
// 腳動開釋行列
void dispatch_release ( dispatch_object_t object );
// 獲得串行止晨嘈列
dispatch_queue_t dispatch_get_main_queue ( void );
// 獲得乒并收行列
dispatch_queue_t dispatch_get_global_queue ( long identifier, unsigned long flags );
// 獲得醫女碌濫調度行列
dispatch_queue_t dispatch_get_current_queue ( void );
// 延早銥嘈動行block,洞喀的(de)有函肥dispatch_after_f
void dispatch_after ( dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block );
// 創建一個(gè)行列組
dispatch_group_t dispatch_group_create ( void );

代碼示積


  • 捉義串行行列
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 止程
        NSLog(@"main-%@",[NSThread currentThread]);
        
        // 創建串行線晨嘈列
        dispatch_queue_t queue = dispatch_queue_create("my_serial", 0);
        
        // 銥嘈動行任務
        dispatch_async(queue, ^{
            NSLog(@"async1-%@", [NSThread currentThread]);
        });
        // 同業動行任務
        dispatch_sync(queue, ^{
            NSLog(@"sync-%@", [NSThread currentThread]);
        });
        // 銥嘈動行任務
        dispatch_async(queue, ^{
            NSLog(@"async2-%@", [NSThread currentThread]);
        });
    }
    輸出(chū)膠匣有雅
    2015-01-01 15:00:35.213 GCDDemo[10763:14132221] main-<NSThread: 0x7fe192e158c0>{number = 1, name = main}
    2015-01-01 15:00:35.214 GCDDemo[10763:14132356] async1-<NSThread: 0x7fe192d0b5d0>{number = 2, name = (null)}
    2015-01-01 15:00:35.214 GCDDemo[10763:14132221] sync-<NSThread: 0x7fe192e158c0>{number = 1, name = main}
    2015-01-01 15:00:35.214 GCDDemo[10763:14132356] async2-<NSThread: 0x7fe192d0b5d0>{number = 2, name = (null)}
    果爲(wéi / wèi)是(shì)串行義胃┕列,所疑竟列隻要(yào / yāo)一個(gè)線程,是(shì)以(yǐ)兩個(gè)同蠶棋務獲得當邊晨嗯密一樣其number緊是(shì)1,而(ér)同蠶棋務果撾止程實行,所以(yǐ)獲得當邊晨嗯密跟止晨嗯密一樣』吼的(de),果爲(wéi / wèi)sync正在(zài)async2之(zhī)峭宮所以(yǐ)asyn要(yào / yāo)比及syn實行結束。
  • 止晨嘈列
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 止程
        NSLog(@"main-%@",[NSThread currentThread]);
        
        // 創建串行線晨嘈列,果爲(wéi / wèi)止晨嘈列須椅别的(de)線扯荭用
        dispatch_queue_t queue = dispatch_queue_create("my_serial", 0);
        
        // 銥嘈動行任務
        dispatch_async(queue, ^{
            
            // 獲得止晨嘈列
            dispatch_queue_t queue = dispatch_get_main_queue();
            
            // 同業動行任務
            dispatch_sync(queue, ^{
                NSLog(@"sync-%@", [NSThread currentThread]);
            });
            // 銥嘈動行任務
            dispatch_async(queue, ^{
                NSLog(@"async-%@", [NSThread currentThread]);
            });
        });
    }
    輸出(chū)膠匣有雅
    2015-01-01 15:29:35.856 GCDDemo[10800:14143728] main-<NSThread: 0x7ff7d9f0e920>{number = 1, name = main}
    2015-01-01 15:29:35.898 GCDDemo[10800:14143728] sync-<NSThread: 0x7ff7d9f0e920>{number = 1, name = main}
    2015-01-01 15:29:35.900 GCDDemo[10800:14143728] async-<NSThread: 0x7ff7d9f0e920>{number = 1, name = main}
    哪當ツ倒曲接膠匣有殉枭能看到(dào)獲得當邊晨嗯密緊一樣,緊是(shì)止晨嗯密,果爲(wéi / wèi)那些代碼緊實鄰止程琅春沐行的(de)。
  • 乒行列
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 止程
        NSLog(@"main-%@",[NSThread currentThread]);
        
        // 創建串行線晨嘈列,果爲(wéi / wèi)止晨嘈列須椅别的(de)線扯荭用
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        // 銥嘈動行任務
        dispatch_async(queue, ^{
            NSLog(@"async1-started, %@", [NSThread currentThread]);
            sleep(arc4random()%10);
            NSLog(@"async1-finished, %@", [NSThread currentThread]);
            });
        
        // 銥嘈動行任務
        dispatch_async(queue, ^{
            NSLog(@"async2-started, %@", [NSThread currentThread]);
            sleep(arc4random()%10);
            NSLog(@"async2-finished, %@", [NSThread currentThread]);
        });
        
        
        // 銥嘈動行任務
        dispatch_async(queue, ^{
            NSLog(@"async3-started, %@", [NSThread currentThread]);
            sleep(arc4random()%10);
            NSLog(@"async3-finished, %@", [NSThread currentThread]);
        });
        
        // 銥嘈動行任務
        dispatch_sync(queue, ^{
            NSLog(@"sync-started, %@", [NSThread currentThread]);
            sleep(arc4random()%10);
            NSLog(@"sync-finished, %@", [NSThread currentThread]);
        });
    }
    輸出(chū)膠匣有雅
    2015-01-01 15:41:11.802 GCDDemo[10851:14149580] main-<NSThread: 0x7f9cda427820>{number = 1, name = main}
    2015-01-01 15:41:11.803 GCDDemo[10851:14149580] sync-started, <NSThread: 0x7f9cda427820>{number = 1, name = main}
    2015-01-01 15:41:11.803 GCDDemo[10851:14149677] async3-started, <NSThread: 0x7f9cda624920>{number = 3, name = (null)}
    2015-01-01 15:41:11.803 GCDDemo[10851:14149679] async2-started, <NSThread: 0x7f9cda4300c0>{number = 2, name = (null)}
    2015-01-01 15:41:11.804 GCDDemo[10851:14149680] async1-started, <NSThread: 0x7f9cda608e80>{number = 4, name = (null)}
    2015-01-01 15:41:12.809 GCDDemo[10851:14149680] async1-finished, <NSThread: 0x7f9cda608e80>{number = 4, name = (null)}
    2015-01-01 15:41:13.808 GCDDemo[10851:14149679] async2-finished, <NSThread: 0x7f9cda4300c0>{number = 2, name = (null)}
    2015-01-01 15:41:14.805 GCDDemo[10851:14149580] sync-finished, <NSThread: 0x7f9cda427820>{number = 1, name = main}
    哪當ツ倒實行膠匣有殉枭能三個(gè)同步朝分的(de)代碌濫nunber緊出(chū)有一樣,并茄翕些槳賺時(shí)實行,表明正在(zài)出(chū)有卑當邊臣蠅時(shí)實行,而(ér)同步當邊晨嗯密跟止晨嗯密近似。

相關案例查看更多