iOS學習 多執行緒開發(NSThread)

2022-07-26 06:30:13 字數 2272 閱讀 7929

具體來說,ios方面多執行緒也就是兩種,pthread以及nsthread。pthread是c語言寫的多執行緒,好處是不僅僅用在ios移動端開發,基本上支援c語言的都可以使用,缺點就是c語言的共性了,不易識別,難記而且並不支援arc。所以在ios中多執行緒開發還是去了解nsthread更好,pthread掌握即可。

在oc物件的使用中,最為常見的就是alloc與init,物件記憶體分配和例項化。所以就有可能出現這種情況:

nsthread *thread1 = [[nsthread alloc] init];

[thread1 start];

實際上這是不行的,nsthread無法直接alloc init,但是可以派生子類來例項化。要使用執行緒物件,可以通過這種方式:

nsthread *thread2 = [[nsthread alloc] initwithtarget:self selector:@selector(runthread) object:nil];

[thread2 start];

當然如果不想使用物件方式開啟執行緒,有更簡便的方式:

[nsthread detachnewthreadselector:@selector(runthread) totarget:self withobject:nil];

當然,這種方式就沒辦法使用執行緒的一些屬性了。可以用thread2.name 來給執行緒自定義乙個名字,這樣當出現執行緒崩潰的情況,可以在左邊的崩潰列表直接定位到是哪個執行緒出現了問題。另外可以通過threadpriority來設定執行緒的優先順序,不過設定優先順序僅僅增加了執行緒的被呼叫概率,而不是完全先呼叫優先順序高的執行緒。

可以看到,雖然優先呼叫了thread2,但是其中仍然穿插了thread3的呼叫。(在多執行緒開發中,不要相信一次或者少數次執行結果);

進一步學習,我們使用執行緒是用來幹什麼的呢?當然是耗時操作不方便放在主線程種呼叫。那麼我們處理完資料後,還是要去修改ui,難道是直接修改就可以了?當然不是,iosui使用都是在主線程中,所有就有了執行緒間通訊技術使用,保證安全準確更新ui

- (void)performselectoronmainthread:(sel)aselector withobject:(nullable id)arg waituntildone:(bool)wait;

第乙個sel是在主線程種執行的方法,第二個arg是需要傳入的引數,第三個wait是表示當前執行緒是否等待,如果為yes,那麼只有等待sel方法執行完了,執行緒才會繼續進行。

在子執行緒中,或許你可以更新ui成功,但是這會出現很多不確定性問題,譬如你今天執行ok,明天再次執行就會掛了,讓你完全摸不著頭腦。

提到上面這個方法,就必定了解到另外乙個

不過這並不是乙個很好的選擇,這樣會開啟乙個始終占用資源的死迴圈執行緒,我們並沒有很好的辦法去停止這個迴圈。

- (void)runthread{

while (!self.isfinshed) {

[[nsrunloop currentrunloop] runmode:nsdefaultrunloopmode beforedate:[nsdate datewithtimeintervalsincenow:0.1f]];

nslog(@"------%@,%@-------",nsstringfromselector(_cmd),[nsthread currentthread]);

- (void)othrerunthread{

self.finshed = yes;

nslog(@"------%@,%@-------",nsstringfromselector(_cmd),[nsthread currentthread]);

我們可以用乙個全域性的判斷條件來進行設定,當othrerunthread未被執行的時候,我們就開啟迴圈0.1秒,不斷的讓執行緒去詢問是否有方法未被執行,當方法已經執行後,就不再進行迴圈。

iOS開發多執行緒 執行緒安全

資源共享 1塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源 比如多個執行緒訪問同乙個物件 同乙個變數 同乙個檔案 當多個執行緒訪問同一塊資源時,很容易引發資料錯亂和資料安全問題 示例一 示例二 問題 import viewcontroller.h inte ce viewcont...

iOS開發 多執行緒篇 多執行緒介紹

一 程序和執行緒 1 什麼是程序 程序是指在系統中正在執行的乙個應用程式 每個程序之間是獨立的,每個程序均執行在其專用且受保護的記憶體空間內 比如同時開啟迅雷 xcode,系統就會分別啟動2個程序 通過 活動監視器 可以檢視mac系統中所開啟的程序 3 執行緒的序列 1個執行緒中任務的執行是序列的 ...

IOS 學習 多執行緒

1 不要同時開太多執行緒 1 3條 2執行緒概念 主線程 ui執行緒 不要把耗時操作放在主線程 子執行緒 一 nsthread 1 建立和啟動執行緒的三種方式 1 先建立 後啟動 建立 nsthread thread nsthread alloc initwithtarget self select...