- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
--1--
知識(shí)點(diǎn):這個(gè)方法是單線程的榛斯,也就是說只有當(dāng)前調(diào)用此方法的函數(shù)執(zhí)行完畢后方仿,selector方法才會(huì)被調(diào)用递览。
- (void)mainMethod
{
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1];
NSLog(@"調(diào)用方法==開始");
sleep(5);
NSLog(@"調(diào)用方法==結(jié)束");
}- (void)delayMethod
{
NSLog(@"執(zhí)行延遲方法");}執(zhí)行結(jié)果(注意log打印的順序):? 調(diào)用方法==開始? 調(diào)用方法==結(jié)束? 執(zhí)行延遲方法
實(shí)戰(zhàn)經(jīng)驗(yàn):正因?yàn)楸痉椒ㄊ且粋€(gè)單線程的,所以有些時(shí)候,我們會(huì)遇到雖然調(diào)用了這個(gè)方法茸塞,但是不執(zhí)行的問題。這時(shí)句喜,我們需要將原代碼改造如下:
改造前代碼:無法執(zhí)行延遲方法
-(void)someMethod
{
[self performSelector:@selector(labelDidDisappeared:) withObject:label afterDelay:2];//因?yàn)槟承┰颍槐徽{(diào)用沟于,沒有執(zhí)行}-(void)labelDidDisappeared:(UILabel *)label
{
[label removeFromSuperview];
[label release];
}
改造后代碼: ?可以正常執(zhí)行延遲方法
-(void)someMethod
{//關(guān)鍵[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];
}
知識(shí)擴(kuò)展:以下兩個(gè)方法均是多線程方法
- (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感謝原作者的無私和奉獻(xiàn)咳胃!
--2--
知識(shí)點(diǎn):該方法只能接受一個(gè)參數(shù)。如果需要傳遞多個(gè)參數(shù)怎么辦呢??讓selector調(diào)用的方法接受的參數(shù)類型修改為Dictionary類型社裆。
注意:
(1)如果調(diào)用的selector不接受參數(shù)則拙绊,withObject:nil
(2)通過performSelector:withObjcet:afterDelay調(diào)用的方法不能有返回值
知識(shí)擴(kuò)展:performSelector 帶多個(gè)參數(shù)
//第一個(gè)試驗(yàn):帶一個(gè)參數(shù)
- (void) fooOneIput:(NSString*) first {
NSLog(@"Logs %@", first);
}
//然后調(diào)用它
[self?performSelector:@selector(fooOneInput:) withObject:@"first"];
//第二個(gè)試驗(yàn):帶多個(gè)參數(shù)
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
NSLog(@"Logs %@ then %@", first, second);
}
//然后調(diào)用它
[self?performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first"withObject:@"second"];
實(shí)戰(zhàn)經(jīng)驗(yàn):經(jīng)實(shí)驗(yàn),只有performSelector: withObject: 方法可以帶多個(gè)參數(shù)泳秀,其它類似的perform方法均不行标沪,包括和此方法最類似的performSelectorInBackground:withObject: 方法。