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)論。