iOS多線程開發之NSThread
一、NSThread基本概念
NSThread是基於線程使用,輕量級的多線程編程方法(相對GCD和NSOperation),一個NSThread對象代表一個線程,需要手動管理線程的生命周期,處理線程同步等問題。
二、創建、啟動線程1、動態實例化 - 先創建再人工啟動
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadingImage) object:nil];
// 線程啟動,在線程thread中執行self的loadingImage方法
[thread start];
2、靜態實例化 - 創建後自啟動
// 創建自啟動,執行loadingImage方法
[NSThread detachNewThreadSelector:@selector(loadingImage) toTarget:self withObject:nil];
3、隱式實例化 - 創建後自啟動
// 創建自啟動,執行loadingImage方法
[self performSelectorInBackground:@selector(loadingImage) withObject:nil];
三、線程式控制制
1、暫停
+ (void)sleepUntilDate:(NSDate *)date;
+ (void)sleepForTimeInterval:(NSTimeInterval)ti;
NSThread的暫停會阻塞當前線程
2、取消
- (void)cancel
NSThread的取消線程並不是馬上停止並退出線程,只作(線程是否需要退出)狀態標記
3、線程停止
+ (void)exit
NSThread的停止方法會立即終止除主線程以外所有線程(無論是否在執行任務)並退出,慎用! 否則可能會導致內存問題
四、NSThread的拓展認識1、一些常用方法
// 獲得主線程
+ (NSThread *)mainThread;
// 判斷是否為主線程(對象方法)
- (BOOL)isMainThread;
// 判斷是否為主線程(類方法)
+ (BOOL)isMainThread;
// 獲得當前線程
NSThread *current = [NSThread currentThread];
2、線程優先順序設置
//iOS8之前
[NSThread setThreadPriority:1.0]; // (0.0,-1.0,1.0)
-----------------------------分割線------------------------------
//iOS8之後
[NSThread setQualityOfService:NSQualityOfServiceUserInitiated];
/*
qualityOfService的枚舉值如下:
NSQualityOfServiceUserInteractive:最高優先順序,用於用戶交互事件
NSQualityOfServiceUserInitiated:次高優先順序,用於用戶需要馬上執行的事件
NSQualityOfServiceDefault:默認優先順序,主線程和沒有設置優先順序的線程都默認為這個優先順序
NSQualityOfServiceUtility:普通優先順序,用於普通任務
NSQualityOfServiceBackground:最低優先順序,用於不重要的任務
*/
3、線程間的通信
// 1、指定當前線程執行操作
[self performSelector:@selector(run)];
[self performSelector:@selector(run) withObject:nil];
[self performSelector:@selector(run) withObject:nil afterDelay:3.0f];
-----------------------------分割線------------------------------------------
// 2、指定在主線程執行操作(如更新UI)
[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];
-----------------------------分割線------------------------------------------
// 3、指定在其他線程操作(主線程->新線程)
// 這裡指定為某個線程newThread
[self performSelector:@selector(run) onThread:newThread withObject:nil waitUntilDone:YES];
// 這裡指定為後台線程
[self performSelectorInBackground:@selector(run) withObject:nil];
五、線程同步
多線程不可避免的會帶來不同線程並發執行時爭奪共享資源的問題(如內存,數據源等),這會造成數據的不一致(臟數據),甚至嚴重的引起死鎖。
線程同步是指是指在一定的時間內只允許某一個線程訪問某個資源,這就像是GCD里的柵欄(dispatch_barrier)或者信號量(dispatch_semphore)一樣。
目前iOS實現線程加鎖有NSLock和@synchronized兩種方式
關於線程鎖的更多相關知識,請參考文章:http://www.jianshu.com/p/35dd92bcfe8c
※Android hook神器frida(一)
※同一個tomcat多個項目共享session,一個tomcat兩個項目共享sessionId
※ELK日誌框架(2):log4net.ElasticSearch+ Kibana實現日誌記錄和顯示
※React Native之APK文件簽名及打包
TAG:科技優家 |
※Discuz API JSON 適用於IOS及Android移動端開發
※Section 10-Halcon實戰寶典之HALCON概述與開發流程
※Android Things OS 開發者預覽版8發布!
※Made in Space為NASA開發可在太空混合3D列印系統
※Square Enix正開發新動作RPG:登陸PS4及Switch
※ESP32 開發板正式通過 Amazon FreeRTOS 的驗證
※谷歌開發新系統Fuchsia 計劃取代Android和Chrome OS
※「深入探討Xbox One X優化」Ninja Theory談《地獄之刃:塞娜的獻祭》4K HDR開發
※WayRay舉辦「True SDK Challenge」大賽,重金招募AR開發者
※Neurala與CSDN宣布戰略合作,將一站式AI平台BrainBuilder帶給中國開發者
※BCH新開發者平台Developer.bitcoin上線,加速BCH應用開發
※NET Core開發日誌——WCF Client
※iOS 12 beta 5 開發者測試版暗示「iPhone X Plus」將有 iPad 的橫屏模式
※Mixed Reality Toolkit-Unity開發系列—Sharing模塊
※NI FlexRIO 使用Kintex UltraScale FPGA和夾層I/O模塊,滿足客戶定製前端開發
※初探Burp Suite API 開發
※Pokémon GO開發商將收購AR公司Escher
※谷歌發布APP開發者平台Flutter beta 支持安卓和iOS
※SE正開發面向Switch和PS4的ARPG
※Windows 10內測版新API介面暗示Surface Phone仍在開發