iOS:多線程技術GCD的使用

GCD的使用:

1.隊列的類型
? ? ?1.1 主隊列:mian queue,主線程隊列,負責更行UI的操作。是一個串行的隊列。
? ? ?1.2 系統默認的并行隊列:global queue,按優先級分類。
? ? ?1.3 自定義的隊列:可以創建串行隊列或者是并行的隊列
?
2.任務
? ? ?2.1 封裝的形式:block方法或C語言的函數
? ? ?2.2 添加到隊列的方式:同步或異步(只對并行隊列有區別)
? ? ? ? ?例如服務器請求:
? ? ? ? ?同步:提交請求->等待服務器處理(這個期間客戶端瀏覽器不能干任何事)->處理完畢返回 ??
? ? ? ? ?異步:請求通過事件觸發->服務器處理(這個期間客戶端瀏覽器仍可以干其他的事)->處理完畢返回
?
3.特殊使用
? ? ?3.1 只執行一次 dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);(多用于單例模式)
? ? ?3.2 延時執行 ? ?dispatch_after(dispatch_time_t?when,dispatch_queue_t??queue,dispatch_block_t block);
? ? ?3.3 成組的執行任務 ? ? ??dispatch_group_create(void);
? ? ?3.4 創建自定義的隊列? ??dispatch_queue_create(const?char?*label,?dispatch_queue_attr_t?attr);
? ? ?3.5 創建默認的全局隊列?dispatch_get_global_queue(long?identifier,?unsigned?long?flags)
? ? ?3.6 獲取主隊列 ? ? ? ? ? ??dispatch_get_main_queue(void)
? ? ?3.7 異步執行 ? ? ? ? ? ? ? ?dispatch_async(dispatch_queue_t?queue,?dispatch_block_t?block);
? ? ?3.8 同步執行 ? ? ? ? ? ? ?dispatch_sync(dispatch_queue_t?queue,?dispatch_block_t?block);
? ? ?3.9 多次執行 ?dispatch_apply(size_t?iterations,?dispatch_queue_t?queue,void (^block)(size_t));
? ? ?…………………等等…………………

4.幾個方法參數解釋:

<1>創建自定義的隊列? ??dispatch_queue_create(const?char?*label,?dispatch_queue_attr_t?attr);

const?char?*label:隊列名字 ?? ? ? ? ? ? ? ? ?dispatch_queue_attr_t?attr:隊列執行方式(串行、并行)

<2>創建默認的全局隊列?dispatch_get_global_queue(long?identifier,?unsigned?long?flags)

long?identifier:隊列執行的優先級 ? ? ? ? ??unsigned?long?flags:默認為0即可

<3>多次執行 ? ? ? ??dispatch_apply(size_t?iterations,?dispatch_queue_t?queue,void?(^block)(size_t));

size_t?iterations:執行次數 ? ? ?dispatch_queue_t?queue:隊列 ? ? ?void?(^block)(size_t):block函數塊

?
5.隊列方式宏定義(用于創建自定義隊列時的參數)

#define DISPATCH_QUEUE_SERIAL NULL ? ? ? ? //串行

#define DISPATCH_QUEUE_CONCURRENT ? ? ? ?//并行

?

6.隊列優先級宏定義(創建全局隊列時的參數)

#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

?

7.更能區分

主隊列:專門用來執行主線程的,進行UI的更新操作

全局隊列或自定義隊列:用來添加并執行其他的線程,進行數據的操作

?

?具體舉例如下:

例子1:采用不分組的方式,將多線程添加到隊列中,然后進行多線程的操作。

1.準備UI界面布局:拖入一個文本視圖控件,并關聯相關的類中,同時在類中聲明一個票數變量

復制代碼
@interface ViewController ()
{NSInteger _tickets;
}
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end
復制代碼

2.設置票數,同時將原來文本視圖中默認的數據清空,取消自動布局便于后面添加數據時自動滾動文本視圖

 //設置數據和文本視圖_tickets = 20;[self.textView setText:@""];self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.創建全局隊列,并設置優先級,設置并行方式

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

4.用GCD創建任務線程,并將線程添加到隊列中,采用異步執行方式

復制代碼
dispatch_async(queue, ^{[self GCDSellTicketMethod:@"GCD售票線程-1"];});dispatch_async(queue, ^{[self GCDSellTicketMethod:@"GCD售票線程-2"];});
復制代碼

5.定義更新UI的方法

#pragma mark -更新UI的操作

復制代碼
-(void)appendTextView:(NSString *)text
{//1.獲取原來的數據NSMutableString *content = [NSMutableString stringWithString:self.textView.text];NSRange range = NSMakeRange(content.length, 2);//2.追加新的內容[content appendString:[NSString stringWithFormat:@"\n%@",text]];[self.textView setText:content];//3.滾動視圖
    [self.textView scrollRangeToVisible:range];
}
復制代碼

6.定義任務線程的執行方法

#pragma mark -執行線程的操作

復制代碼
-(void)GCDSellTicketMethod:(NSString *)name
{while (YES){if(_tickets > 0){//使用GCDdispatch_async(dispatch_get_main_queue(), ^{//更新UINSString *info = [NSString stringWithFormat:@"總票數:%ld,當前的線程:%@",_tickets,name];[self appendTextView:info];//賣票_tickets--;});//線程休眠if([name isEqualToString:@"GCD售票線程-1"]){[NSThread sleepForTimeInterval:0.3f];}else{[NSThread sleepForTimeInterval:0.2f];}}else{//使用GCD更新UIdispatch_async(dispatch_get_main_queue(), ^{NSString *info = [NSString stringWithFormat:@"票已經賣完,當前線程:%@",name];[self appendTextView:info];});//退出線程break;}}
}
復制代碼

?

例子2:采用分組的方式,將線程組添加到隊列中,然后進行多線程的操作。

1.準備UI界面布局:拖入一個文本視圖控件,并關聯相關的類中,同時在類中聲明一個票數變量

復制代碼
@interface ViewController ()
{NSInteger _tickets;
}
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end
復制代碼

2.設置票數,同時將原來文本視圖中默認的數據清空,取消自動布局便于后面添加數據時自動滾動文本視圖

 //設置數據和文本視圖_tickets = 20;[self.textView setText:@""];self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.創建一個線程分組

dispatch_group_t group = dispatch_group_create();

4.創建自定義的隊列,并設置隊列執行方式為并行方式

??dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

5.用GCD創建任務線程組,并將線程組添加到隊列中,采用分組異步執行方式

復制代碼

? dispatch_group_async(group,queue, ^{

? ? ? [self GCDSellTicketMethod:@"GCD售票線程-1"];

? });? ?

? dispatch_group_async(group,queue, ^{

? ? ? [self GCDSellTicketMethod:@"GCD售票線程-2"];

? });

復制代碼

6.等線程組中的所有任務完成后,會接收到通知,更新UI

復制代碼
dispatch_group_notify(group, queue, ^{dispatch_async(dispatch_get_main_queue(), ^{NSString *info = [NSString stringWithFormat:@"票已經賣完"];[self appendTextView:info];});});
復制代碼

7.定義更新UI的方法

#pragma mark -更新UI的操作

復制代碼
-(void)appendTextView:(NSString *)text
{//1.獲取原來的數據NSMutableString *content = [NSMutableString stringWithString:self.textView.text];NSRange range = NSMakeRange(content.length, 2);//2.追加新的內容[content appendString:[NSString stringWithFormat:@"\n%@",text]];[self.textView setText:content];//3.滾動視圖[self.textView scrollRangeToVisible:range];
}
復制代碼

8.定義任務線程的執行方法

#pragma mark -執行線程的操作

復制代碼
-(void)GCDSellTicketMethod:(NSString *)name
{while (YES){if(_tickets > 0){//使用GCDdispatch_async(dispatch_get_main_queue(), ^{//更新UINSString *info = [NSString stringWithFormat:@"總票數:%ld,當前的線程:%@",_tickets,name];[self appendTextView:info];//賣票_tickets--;});//線程休眠if([name isEqualToString:@"GCD售票線程-1"]){[NSThread sleepForTimeInterval:0.3f];}else{[NSThread sleepForTimeInterval:0.2f];}}else{     //退出線程break;}}
}
復制代碼

?

兩種情況的演示結果如下:

?

?

?

?

?

?

?

程序猿神奇的手,每時每刻,這雙手都在改變著世界的交互方式!
分類:?iOS高級

本文轉自當天真遇到現實博客園博客,原文鏈接:http://www.cnblogs.com/XYQ-208910/p/4859089.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395624.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java什么叫一致性,java-順序一致性易失性說明

我正在從Java Jpoint會議觀看視頻.我對以下來自Alexey Shipilev報告的幻燈片有疑問&#xff1a;打擾一下,請不要打擾我.實際上,作者說不可能將變量集設置為r1 1 (Y)r2 0 (x)r3 1 (x)r4 0 (Y)根據視頻,他暗示很明顯.有人可以澄清為什么JMM無法設置此值嗎&#xff1f;附言如果…

模塊制作標準說明

原則一&#xff1a;CSS定義越少越好原則二&#xff1a;進來用<ul><li>等簡單的HTML代碼結構原則三&#xff1a;命名盡可能用CSS偽類原則四&#xff1a;一個模塊CSS名稱不能超過三個需要改正的寫法&#xff1a; <div class"fenglei"><div class&…

【c++】string類的使用

目錄 一、標準庫中的string類 1、簡單介紹string類 2、string類的常用接口注意事項 2.1、string類對象的常用構造 2.2、string類對象的容量操作 2.3、string類對象的訪問及遍歷操作 2.4、string類對象的修改操作 二、string類的模擬實現 一、標準庫中的string類 1、簡…

拜托了

by Buddy Reno由Buddy Reno Git Please &#xff1a;如何在不做蠢事的情況下強行推動 (Git Please: how to force push without being a jerk) As the size of a dev team grows, so does the likelihood of someone doing a force push and overwriting someone else’s code…

性能測試類型

1.驗收性能測試 驗收性能測試&#xff08;Acceptance Performance Testing&#xff09;方法通過模擬生產運行的業務壓力量和使用場景組合&#xff0c;測試系統的性能是否滿足生產性的要求。通俗的說&#xff1a;在特定的運行條件下驗證系統的能力狀況。 &#xff08;1&#xff…

Java - 對象(object) 具體解釋

對象(object) 具體解釋 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24059545 對象(object)的實例能夠是 物理對象(如 人, 車等實物) 或 邏輯對象(如 運動, 健康等); 對象是將狀態(數據) 和行為(功能) 組合在一起的軟件模塊. 類是描寫敘述一組相似對象共同…

kkt條件的matlab仿真,請教關于SVM中KKT條件的推導

KKT條件第一項是說最優點必須滿足所有等式及不等式限制條件&#xff0c;也就是說最優點必須是一個可行解&#xff0c;這一點自然是毋庸置疑的。第二項表明在最優點 x*&#xff0c; ?f 必須是 ?hj 和 ?gk 的線性組合&#xff0c;和都叫作拉格朗日乘子。所不同的是不等式限制條…

公共wifi做家用_如何在公共網絡上獲得免費的wifi

公共wifi做家用by Kyle McDonald凱爾麥克唐納(Kyle McDonald) 如何在公共網絡上獲得免費的wifi (How to get free wifi on public networks) This short tutorial describes a few methods for gaining access to the internet, a basic human right, from public wireless ne…

python學習之旅

一、入門 1.Python 面向對象編程 2.jquery入門 3.HTMLCSS基礎入門 4.Javascript初步 5.Python語言編程基礎 二、初級階段 1.Git 與 GitHub 2.Python 爬蟲基礎 3.django進階 4.django項目部署 5.ajax入門 6.django基礎 7.Mysql基礎 三、中級階段 1.Linux基礎 2.Python :socket a…

c/c++ 重載運算符 函數調用運算符

重載運算符 函數調用運算符 把一個類的對象a&#xff0c;當成函數來使用&#xff0c;比如a()&#xff0c;所以需要重載operator()方法。重載了函數調用運算符的類的對象&#xff0c;就是函數對象了。 還有什么是函數對象呢&#xff1f;&#xff1f;&#xff1f; lambda是函數對…

matlab 萬能,matlab 萬能實用的線性曲線擬合方法

在科學計算和工程應用中&#xff0c;經常會遇到需要擬合一系列的離散數據&#xff0c;最近找了很多相關的文章方法&#xff0c;在這里進行總結一下其中最完整、幾乎能解決所有離散參數線性擬合的方法第一步&#xff1a;得到散點數據根據你的實際問題得到一系列的散點例如&#…

socket websocket

1.websocket客戶端 websocket允許通過JavaScript建立與遠程服務器的連接&#xff0c;從而實現客戶端與服務器間雙向的通信。在websocket中有兩個方法&#xff1a;      1、send() 向遠程服務器發送數據    2、close() 關閉該websocket鏈接  websocket同時還定義了幾…

javascript原型_JavaScript的原型:古怪,但這是它的工作原理

javascript原型by Pranav Jindal通過普拉納夫金達爾 JavaScript的原型&#xff1a;古怪&#xff0c;但這是它的工作原理 (Prototype in JavaScript: it’s quirky, but here’s how it works) The following four lines are enough to confuse most JavaScript developers:以下…

mysql函數之SUBSTRING_INDEX(str,/,-1)

SUBSTRING_INDEX的用法&#xff1a; ?SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出現前&#xff0c;從字符串str返回自字符串。若count為正值,則返回最終定界符(從左邊開始) 若為-1則是從后往前截取 SELECT substring_index(Hn_P00001, P, -1) -- 結果是…

mysql8.0主從配置,MySQL 8.0主從服務器(Master-Slave)配置

一、介紹MySQL 主從復制的方式有多種&#xff0c;本文主要演示基于基于日志(binlog)的主從復制方式。MySQL 主從復制(也稱 A/B 復制) 的原理&#xff1a;Master將數據改變記錄到二進制日志(binary log)中&#xff0c;也就是配置文件log-bin指定的文件&#xff0c; 這些記錄叫做…

第十二章 Shell腳本編寫及常見面試題(三)

本章目錄&#xff1a;12.21 FTP下載文件#!/bin/bash if [ $# -ne 1 ]; thenecho "Usage: $0 filename" fi dir$(dirname $1) file$(basename $1) ftp -n -v << EOF # -n 自動登錄 open 192.168.1.10 user admin adminpass binary # 設置ftp傳輸模式為二進制…

亞馬遜面試有幾輪_經過幾個月的Google面試準備,我被亞馬遜錄用

亞馬遜面試有幾輪by Googley as Heck由Googley飾演Heck 經過幾個月的Google面試準備&#xff0c;我被亞馬遜錄用 (After months of preparing for the Google interview, I got hired by Amazon) As you may know, the last 11 months have been very difficult for me. As a …

省選前的考試記錄

日拱一卒功不唐捐 什么沙雕玩意兒 2018.12.24 T1 如果對 \(A\) 數組求出來高度遞減的單調棧的話&#xff0c;會發現只有單調棧里的元素是有用的。因為如果有 \(A[i]<A[j] \And i<j\)&#xff0c;那電梯就可以在帶 \(j\) 上樓的時候順便把 \(i\) 帶上并不會影響結果。所以…

軟件工程課設-----日程管理系統

這學期進行了軟件工程課設&#xff0c;題目是&#xff1a;日程管理系統&#xff08;JavaWeb&#xff09;&#xff0c;為期3周。這三周只有前兩天是企業老師講解是企業老師講解相關的基礎知識(老師講的水平實在是不可恭維。。。。。。)。 多的不多說。直接進行對相關項目的介紹。…

matlab中的神經網絡訓練,MATLAB中的神經網絡訓練

我試圖向前饋送反向傳播&#xff0c;但是在網絡訓練之后&#xff0c;當模擬和打印模擬輸出時&#xff0c;我看不到任何靠近目標的值&#xff0c;但它只是一個數字。代碼如下。什么是錯&#xff0c;什么是問題&#xff1f;前饋反向傳播&#xff1a;>> load(E:/Inputdata.t…