iOS 多線程

  • 1.進程和線程
    什么是進程?
進程當用戶下達執(zhí)行應用程序命令時,所啟動的東西。

什么是線程?

線程是進程的執(zhí)行單位,比喻線程是工廠里的工人,而進程比作是工廠

- 2. 多線程
 為了更好的進行一些程序的操作,節(jié)省時間,提高效率。
 一個進程不能過多的創(chuàng)建線程,資源消耗太大(工廠能有太多的工人,工資不可以發(fā)太多)開辟5個左右的線程就可以。

注意:所有的UI的操作,都放在主線程中進行,
需要開辟線程的耗時操作,包括圖像文字渲染,大數(shù)據(jù)存儲。網(wǎng)絡請求等。

## iOS線程下  NSThread
1> currentThread 獲取當前線程
 NSThread *thread = [NSThread currentThread];
打印結果:<NSThread: 0x7fad10603a40>{number = 1, name = main}
name代表線程名字
number 線程編號
main 代表主線程
2> 開辟個子線程
子線程隨機創(chuàng)建
[NSThread detachNewThreadSelector:@selector(detachNewThread) toTarget:self withObject:nil];
打印線程隨機創(chuàng)建
3> 延遲當前的線程執(zhí)行,固定日期
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10];
  [NSThread sleepUntilDate:date];
延遲10 s
 4> 相對時間
 [NSThread sleepForTimeInterval:1];
5> exit 退出當前線程, 不要退出主線程
退出后線程后續(xù)操作不會再執(zhí)行,
[NSThread exit];
6> priority 線程的優(yōu)先級
默認線程優(yōu)先級都為0.5
 double priority = [NSThread threadPriority];
    NSLog(@"%lf", priority);
double 類型
7> isMainThread 判斷是否是主線程
判斷當前線程是不是主線程
[NSThread isMainThread];
判斷線程對象是不是主線程
[[NSThread mainThread] isMainThread];
8>  初始化方法
初始化一個未啟動的線程
需要手動管理線程
NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(newThread1) object:nil];
    [newThread start];

注意:子線程加載完成后一定要返回主線程顯示
返回主線程方法:performSelectorOnMainThread

*#pragma mark 加載圖片-(void)loadImage{
//請求數(shù)據(jù)NSData data= [self requestData];
/
將數(shù)據(jù)顯示到UI控件,注意只能在主線程中更新UI,另外performSelectorOnMainThread方法是NSObject的分類方法,每個NSObject對象都有此方法,它調用的selector方法是當前調用控件的方法,例如使用UIImageView調用的時候selector就是
UIImageView的方法Object:代表調用方法的參數(shù),不過只能傳遞一個參數(shù)(如果有多個參數(shù)請使用對象進行封裝)waitUntilDone:是否線程任務完成執(zhí)行 */
[self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
}

pragma mark 多線程下載圖片-(void)loadImageWithMultiThread{

//方法1:使用對象方法//創(chuàng)建一個線程,第一個參數(shù)是請求的操作,第二個參數(shù)是操作方法的參數(shù)// NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
啟動一個線程,注意啟動一個線程并非就一定立即執(zhí)行,而是處于就緒狀態(tài),當系統(tǒng)調度時才真正執(zhí)行
[thread start];
//方法2:使用類方法
[NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
}

##GCD
1> GCD 全稱是Grand central dispatch
2> GCD 核心概念隊列, 管理任務拆分分配到隊里中,系統(tǒng)會自動為我們創(chuàng)建線程和調度線程,自動。
3> GCD 中的隊列嚴格遵循fifo(先進先出)法則
 對列分為
1>串行DISPATCH_QUEUE_SERIAL / NULL
2>并行DISPATCH_QUEUE_CONCURRENT
4> 隊列的創(chuàng)建
串行
自己創(chuàng)建的隊列
 dispatch_queue_t queue = dispatch_queue_create("queue", NULL);
并行
系統(tǒng)提供的隊列
dispatch_queue_t queue2 =  dispatch_queue_create("queue1", DISPATCH_QUEUE_CONCURRENT)
主隊列是串行
dispatch_queue_t queue3 = dispatch_get_main_queue();
全局隊列
參數(shù)1. 調度隊列優(yōu)先級
參數(shù)2. 給未來使用,占位使用默認填0
dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
術語:
串行,一個任務執(zhí)行完成,在執(zhí)行下個任務
并發(fā),多個任務同時執(zhí)行
同步 串行隊列(不會創(chuàng)建線程)
同步 在當前線程做時,不能開辟線程
異步 在新創(chuàng)建的線程做事, 執(zhí)行任務,可以開辟線程
同步串行隊列 不會創(chuàng)建線程
串發(fā) 創(chuàng)建一條新的線程, 在改線程中執(zhí)行任務
并發(fā) 根據(jù)任務決定需要創(chuàng)建多少線程
同步 并發(fā)(不會創(chuàng)建線程)
同步主線程(不會執(zhí)行)
主線程等待同步操作結束,同步操作在主線程執(zhí)行,互相等待 同步主線程,導致程序卡死
同步全局隊列(不會創(chuàng)建線程)并發(fā)的;

希望可以幫助大家
討論iOS技術、提些意見?QQ : 251099939
在線解答
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 一、前言 上一篇文章iOS多線程淺匯-原理篇中整理了一些有關多線程的基本概念。本篇博文介紹的是iOS中常用的幾個多...
    nuclear閱讀 2,144評論 6 18
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項。當然也會給出幾種多線程的案...
    張戰(zhàn)威ican閱讀 693評論 0 0
  • 在這篇文章中,我將為你整理一下 iOS 開發(fā)中幾種多線程方案,以及其使用方法和注意事項。當然也會給出幾種多線程的案...
    伯恩的遺產(chǎn)閱讀 275,619評論 251 2,329
  • 歡迎大家指出文章中需要改正或者需要補充的地方,我會及時更新,非常感謝。 一. 多線程基礎 1. 進程 進程是指在系...
    xx_cc閱讀 7,380評論 11 70
  • 初見你,你是講臺上睿智風趣的歷史老師,而彼時的我,是反逆期的少女。喜歡歷史,并不是因為培根說讀史使人明智,而是初中...
    萬俟伶仃閱讀 293評論 0 0

友情鏈接更多精彩內容