在此我對performSelector系列方法進行了總結
1、
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
這三個方法都是同步執行,與線程無關,在需要動態的去調用方法的時候去使用。
例如:
[self performSelector:@selector(configUI)]; 與[self configUI]; 效果完全相同。
withObject:(id)object 這是要傳遞的參數
2、
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSString *> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
這兩個方法為異步執行,只能在主線程中執行。可用於點擊UI中一個按鈕會觸發一個消耗性能的事件,在事件執行期間按鈕會一直處於高亮狀態,此時可以調用該方法去異步的處理該事件,避免上述問題。
在方法未到執行時間之前,取消方法為:
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
調用該方法之前或在該方法所在的viewController生命周期結束的時候去調用取消函數,以確保不會引起內存泄露。
3、
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
這兩個方法,在主線程和子線程中均可執行,均會調用主線程的aSelector方法
如果設置wait為YES:等待當前線程執行完以后,主線程才會執行aSelector方法;
設置為NO:不等待當前線程執行完,就在主線程上執行aSelector方法。
如果,當前線程就是主線程,那么aSelector方法會馬上執行。
注意:apple不允許程序員在主線程以外的線程中對ui進行操作,此時我們必須調用performSelectorOnMainThread函數在主線程中完成UI的更新
4、
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array NS_AVAILABLE(10_5, 2_0);
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait NS_AVAILABLE(10_5, 2_0);
在我們指定的線程中調用方法。
5、
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg NS_AVAILABLE(10_5, 2_0);
后台執行