iOS多線程-GCD之經常使用函數

  • 延遲執行任務函數dispatch_after(.....)

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"start"); //dispatch_after 是異步執行的 //隊列只決定在哪一個線程中執行任務 並不能決定執行時間 /** * 第一個參數: 在哪一個時間點執行 * dispatch_time(從哪一個時間點開始,經歷多少納秒) * 第二個參數: 在哪一個隊列中執行block任務 * 第三個參數: block任務 */ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ NSLog(@"%@",[NSThread currentThread]); }); NSLog(@"end"); }




原文連接:http://www.jianshu.com/p/4e46b4e0eb65

  • 一次性執行dispatch_once(...)

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //一次性執行的機制,能保證在程序啓動後只會執行一次,而且是線程安全的,在主線程中執行 //通常使用dispatch_once來作一次性執行,效率高, 在單例模式中使用. //能夠利用互斥鎖在實現此功能,但不建議使用,由於效率很是低!!!! static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@""); }); }
  • 柵欄函數dispatch_barrier_async/dispatch_barrier_sync

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ dispatch_queue_t queue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ NSLog(@"任務1"); }); dispatch_async(queue, ^{ NSLog(@"任務2"); }); //柵欄函數(同步函數就不必控制順序了,由於它是有序的) //dispatch_barrier_async 是異步函數不會阻塞線程 //dispatch_barrier_sync 是同步函數 會阻塞線程 //若是全部任務都在同一個並行隊列中,而且這個並行隊列不是系統自帶全局並行隊列 //哪麼在barrier以前添加的方法會先被執行,只有等barrier以前的任務執行完畢後纔會執行barrier任務 //只有barrier任務執行完畢後,纔會執行後添加的任務 dispatch_barrier_async(queue, ^{ NSLog(@"我是個可愛的路障"); }); dispatch_async(queue, ^{ NSLog(@"任務3"); }); dispatch_async(queue, ^{ NSLog(@"任務4"); }); NSLog(@"end"); }
  • 隊列組的使用dispatch_group_t

    • 方式一:

      -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //建立一個隊列組 dispatch_group_t group = dispatch_group_create(); //建立兩個不一樣的隊列來測試 dispatch_queue_t queue1 = dispatch_get_global_queue(0, 0); dispatch_queue_t queue2 = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_CONCURRENT); //dispatch_group_async 異步函數 //系統會先把任務放入隊列中,而後把隊列放入組中 //從組中把隊列取出來,在從隊列裏取任務執行 dispatch_group_async(group, queue1, ^{ [NSThread sleepForTimeInterval:1.0]; NSLog(@"download 1"); }); dispatch_group_async(group, queue2, ^{ [NSThread sleepForTimeInterval:1.0]; NSLog(@"download 2"); }); //給group添加一個通知,異步函數 //當group隊列中全部任務執行完畢,就會通知group執行block /* * 第一個參數: 爲那個隊列組添加通知 * 第二個參數: 決定block在什麼線程中執行 * 第三個參數: block 代碼塊 */ dispatch_group_notify(group, dispatch_queue_create("yuxuan1",DISPATCH_QUEUE_CONCURRENT), ^{ NSLog(@"OK"); }); NSLog(@"end"); }
    • 方式二:

      -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ /* dispatch_group_async底層實現: void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block) { dispatch_retain(group); dispatch_group_enter(group); dispatch_async(queue, ^{ block(); dispatch_group_leave(group); dispatch_release(group); }); } */ dispatch_queue_t queue = dispatch_get_global_queue(0, 0); //建立一個隊列組 dispatch_group_t group = dispatch_group_create(); //通知隊列組進入隊列組 dispatch_group_enter(group); dispatch_async(queue, ^{ NSLog(@"111"); //任務執行完畢 //通知隊列組離開隊列組 dispatch_group_leave(group); }); //通知隊列組進入隊列組 dispatch_group_enter(group); dispatch_async(queue, ^{ NSLog(@"222"); //任務執行完畢 //通知隊列組離開隊列組 dispatch_group_leave(group); }); //等待全部任務執行完畢,一直等待.會阻塞線程 dispatch_group_wait(group, DISPATCH_TIME_FOREVER); // dispatch_group_notify(group, queue, ^{ // NSLog(@"over"); // }); }
  • GCD定時器

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //建立一個隊列,建立GCD定時器時使用 dispatch_queue_t queue = dispatch_queue_create("yuxuan", DISPATCH_QUEUE_SERIAL); //建立一個GCD定時器(觸發器) //第四個參數:傳入一個隊列,決定了定時器回調任務執行方式. dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); //dispatch_source_t其實本質是一個類,因爲是局部變量,方法執行完,就會被釋放. self.timer = timer; //設置定時器 /* 第一個參數:給那個定時器設置 第二個參數:何時啓動 第三個參數:間隔多久執行一次 第四個參數:設置精準度:0 表明最高精準(儘可能讓定時器精準), 大於0的的話表明是在多少秒內接受. 第四個參數存在乎義:主要是爲了提升程序性能, 設置越大,能減輕CPU的壓力 注意:GCD定時器傳入的時間都是納秒 */ dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC); //第一個參數:給那個定時器設置 //第二個參數:設置定時器回調block //異步執行的,具備建立新線程的能力 //具體是否建立線程,建立幾條線程是由定時任務建立時,傳入的queue決定的 dispatch_source_set_event_handler(timer, ^{ NSLog(@"%@",[NSThread currentThread]); }); //啓動定時器 dispatch_resume(timer); }
相關文章
相關標籤/搜索