- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
--1--
知識點:這個方法是單線程的,也就是說只有當前調用此方法的函數執行完畢后,selector方法才會被調用。
- (void)mainMethod { [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1]; NSLog(@"調用方法==開始"); sleep(5); NSLog(@"調用方法==結束"); } - (void)delayMethod { NSLog(@"執行延遲方法"); } 執行結果(注意log打印的順序): 調用方法==開始 調用方法==結束 執行延遲方法
實戰經驗:正因為本方法是一個單線程的,所以有些時候,我們會遇到雖然調用了這個方法,但是不執行的問題。這時,我們需要將原代碼改造如下:
改造前代碼:無法執行延遲方法
-(void)someMethod { [self performSelector:@selector(labelDidDisappeared:) withObject:label afterDelay:2]; //因為某些原因,不被調用,沒有執行 } -(void)labelDidDisappeared:(UILabel *)label { [label removeFromSuperview]; [label release]; }
改造后代碼: 可以正常執行延遲方法
-(void)someMethod { //關鍵 [self performSelectorOnMainThread:@selector(labelWillDisappeared:) withObject:label waitUntilDone:NO]; } -(void)labelWillDisappeared:(UILabel *)label { [self performSelector:@selector(labelDidDisappeared:) withObject:label afterDelay:2]; } -(void)labelDidDisappeared:(UILabel *)label { [label removeFromSuperview]; [label release]; }
知識擴展:以下兩個方法均是多線程方法
- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
和
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
參考:http://blog.csdn.net/baxiaxx/article/details/7878338 感謝原作者的無私和奉獻!
--2--
知識點:該方法只能接受一個參數。如果需要傳遞多個參數怎么辦呢? 讓selector調用的方法接受的參數類型修改為Dictionary類型。
注意:
(1)如果調用的selector不接受參數則,withObject:nil
(2) 通過performSelector:withObjcet:afterDelay調用的方法不能有返回值
知識擴展:performSelector 帶多個參數
//第一個試驗:帶一個參數
- (void) fooOneIput:(NSString*) first {
NSLog(@"Logs %@", first);
}
//然后調用它
[self performSelector:@selector(fooOneInput:) withObject:@"first"];
//第二個試驗:帶多個參數
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
NSLog(@"Logs %@ then %@", first, second);
}
//然后調用它
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"];
實戰經驗:經實驗,只有performSelector: withObject: 方法可以帶多個參數,其它類似的perform方法均不行,包括和此方法最類似的performSelectorInBackground:withObject: 方法。
延伸閱讀:
IOS 取消延遲執行函數 (perform selector)
IOS 關於取消延遲執行函數的種種:performSelector與cancelPreviousPerformRequestsWithTarget