performSelector:withObject:afterDelay: 精要概覽(持續更新)


- (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不接受參數則,withObjectnil 

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開發之延遲執行

IOS 取消延遲執行函數 (perform selector)

IOS 關於取消延遲執行函數的種種:performSelector與cancelPreviousPerformRequestsWithTarget

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM