NSThread
通過NSThread手段來開闢執行緒的注意事項
- 當執行緒使我們手動開闢的時候需要我們自己來管理執行緒。
- 如果是使用初始化的方式開闢建立的子執行緒,那麼需要我們手動開啟執行緒。
- 取消當前執行緒,取消掉執行緒之後子執行緒中的程式碼照樣還會執行,我們需要在合適的地方使用cancelled這個屬性來判斷當前執行緒是否被取消。
示例程式碼
NSThread中幾個常用的幾個方法和屬性
@property (readonly, getter=isCancelled) BOOL cancelled NS_AVAILABLE(10_5, 2_0);
//判斷當前執行緒的狀態,返回值是BOOL型別。
+(NSThread *)currentThread;//獲取當前的執行緒。
-(void)cancel NS_AVAILABLE(10_5, 2_0);//取消執行緒
-(void)start NS_AVAILABLE(10_5, 2_0);//開啟執行緒
+(void)exit;//執行緒停止
複製程式碼
在方法中使用NSThread建立一個子執行緒
- 兩種建立子執行緒的方式 類方法的方式開闢執行緒,不需要手動啟動。
+(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;
複製程式碼
初始化的方式開闢建立的子執行緒,需要我們手動開啟執行緒。
-(instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);
複製程式碼
下面是使用初始化方法建立子執行緒的例子
-(void)threadMethod{
myThread = [[NSThread alloc]initWithTarget:self selector:@selector(forAction) object:nil];
//object:回撥方法的引數。
myThread.name = @"xiaoming";//為開闢的子執行緒命名
[myThread start];//開啟執行緒
}
複製程式碼
回撥方法
-(void)forAction{
//當程式碼片段是在我們自己手動開闢的執行緒中執行的需要我們手動管理記憶體,這個時候,我們需要將程式碼片段放在自動釋放池中。
@autoreleasepool {
for (int i = 0; i < 100000000; i++) {
if (myThread.cancelled) {
break;
}
NSLog(@"%d",i);
NSLog(@"viewDidLoad===%@",[NSThread currentThread]);
}
NSLog(@"我是子執行緒%@",[NSThread currentThread]);
}
複製程式碼
從子執行緒回到主執行緒
- 在NSObject這個基類中系統為我們提供了相關的方法,我們只需要在我們需要的地方呼叫這個方法即可回到主執行緒。
-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
複製程式碼
- aSelector:是一個回撥方法我們可以在這裡執行一些我們想要的操作。
- Object:回撥方法的引數,如果回撥方法帶引數,則填寫引數,如果沒有則直接填寫nil即可
- waitUntilDone:YES回撥方法中的所有程式碼執行完成了,才會執行當前執行緒中剩餘的程式碼。NO不會等待回撥方法中的程式碼執行完成。
NSobject
系統的根類中為我們提供了一個隱式開闢子執行緒的方法,所謂的隱式開闢就是在後臺執行開闢子執行緒的操作。方法如下。
-(void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg NS_AVAILABLE(10_5, 2_0);
複製程式碼
總結
這裡我們一共介紹了兩種開闢子執行緒的方法和一種返回主執行緒的方法,如果大家對這兩種方法還有什麼好的建議和意見,歡迎評論。