iOS 多線程之NSThread和NSObject

NSThread

通過NSThread手段來開辟線程的注意事項(xiàng)

  • 當(dāng)線程使我們手動(dòng)開辟的時(shí)候需要我們自己來管理線程。
  • 如果是使用初始化的方式開辟創(chuàng)建的子線程,那么需要我們手動(dòng)開啟線程。
  • 取消當(dāng)前線程,取消掉線程之后子線程中的代碼照樣還會(huì)執(zhí)行,我們需要在合適的地方使用cancelled這個(gè)屬性來判斷當(dāng)前線程是否被取消。

示例代碼

NSThread中幾個(gè)常用的幾個(gè)方法和屬性

@property (readonly, getter=isCancelled) BOOL cancelled NS_AVAILABLE(10_5, 2_0);
//判斷當(dāng)前線程的狀態(tài),返回值是BOOL類型。
+(NSThread *)currentThread;//獲取當(dāng)前的線程。
-(void)cancel NS_AVAILABLE(10_5, 2_0);//取消線程
-(void)start NS_AVAILABLE(10_5, 2_0);//開啟線程
+(void)exit;//線程停止

在方法中使用NSThread創(chuàng)建一個(gè)子線程

  • 兩種創(chuàng)建子線程的方式
    類方法的方式開辟線程,不需要手動(dòng)啟動(dòng)。
+(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

初始化的方式開辟創(chuàng)建的子線程,需要我們手動(dòng)開啟線程。

-(instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);

下面是使用初始化方法創(chuàng)建子線程的例子

-(void)threadMethod{
    myThread = [[NSThread alloc]initWithTarget:self selector:@selector(forAction) object:nil];
//object:回調(diào)方法的參數(shù)。
    myThread.name = @"xiaoming";//為開辟的子線程命名
    [myThread start];//開啟線程
}

回調(diào)方法

-(void)forAction{
//當(dāng)代碼片段是在我們自己手動(dòng)開辟的線程中執(zhí)行的需要我們手動(dòng)管理內(nèi)存,這個(gè)時(shí)候,我們需要將代碼片段放在自動(dòng)釋放池中。
    @autoreleasepool {
        for (int i = 0; i < 100000000; i++) {
            if (myThread.cancelled) {
                break;
           }
           NSLog(@"%d",i);
            NSLog(@"viewDidLoad===%@",[NSThread currentThread]);
        }
        NSLog(@"我是子線程%@",[NSThread currentThread]);
}

從子線程回到主線程

  • 在NSObject這個(gè)基類中系統(tǒng)為我們提供了相關(guān)的方法,我們只需要在我們需要的地方調(diào)用這個(gè)方法即可回到主線程。
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
  • aSelector:是一個(gè)回調(diào)方法我們可以在這里執(zhí)行一些我們想要的操作。
  • Object:回調(diào)方法的參數(shù),如果回調(diào)方法帶參數(shù),則填寫參數(shù),如果沒有則直接填寫nil即可
  • waitUntilDone:YES回調(diào)方法中的所有代碼執(zhí)行完成了,才會(huì)執(zhí)行當(dāng)前線程中剩余的代碼。NO不會(huì)等待回調(diào)方法中的代碼執(zhí)行完成。

NSobject

系統(tǒng)的根類中為我們提供了一個(gè)隱式開辟子線程的方法,所謂的隱式開辟就是在后臺(tái)執(zhí)行開辟子線程的操作。方法如下。

-(void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg NS_AVAILABLE(10_5, 2_0);

總結(jié)

這里我們一共介紹了兩種開辟子線程的方法和一種返回主線程的方法,如果大家對(duì)這兩種方法還有什么好的建議和意見,歡迎評(píng)論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概覽 大家都知道,在開發(fā)過程中應(yīng)該盡可能減少用戶等待時(shí)間,讓程序盡可能快的完成運(yùn)算??墒菬o論是哪種語言開發(fā)的程序最...
    CocoLeo閱讀 904評(píng)論 1 9
  • 開啟線程 分離主線程創(chuàng)建:創(chuàng)建線程后會(huì)自動(dòng)執(zhí)行,但是線程外部不可獲取到該線程對(duì)象detachNewThreadWi...
    Mr_Pt閱讀 1,126評(píng)論 0 1
  • .一.進(jìn)程 進(jìn)程:是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序,每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專用且受保護(hù)的內(nèi)存空...
    IIronMan閱讀 4,604評(píng)論 1 33
  • 一個(gè)人的冬天, 天還是藍(lán)得正好, 木棉樹在寒風(fēng)里招搖, 葉落空飄飄。 你一襲青衫布襖, 嘴角盈著笑, 不曾回頭把來...
    紫草茵茵閱讀 225評(píng)論 0 5
  • 1. 你著手于你的評(píng)估并試圖證明一個(gè)方面是正確的。 2. 你開始你的調(diào)查并假設(shè)大家所眾所周知的觀點(diǎn)將被證明是正確的...
    梁夢(mèng)婷閱讀 348評(píng)論 0 1

友情鏈接更多精彩內(nèi)容