- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
这个方法是单线程的,也就是说只有当前调用次方法的函数执行完毕后,selector方法才会被调用。
也就是(调用别人的代码):
- (void)mainMethod { [self performSelector:@selector(delayMethod) withObject:nil afterDelay:1]; NSLog(@"调用方法==开始"); sleep(5); NSLog(@"调用方法==结束"); } - (void)delayMethod { NSLog(@"执行延迟方法"); } 执行结果(注意log打印的顺序): 调用方法==开始 调用方法==结束 执行延迟方法
也是有Object的对象的这可以直接使用:
//在这方法里,UI一般是要放在主线程中运行的。
[self performSelector:@selector(onImageStopInPer:)withObject:imageView afterDelay:imageView.animationDuration*imageView.animationRepeatCount];
-(void)onImageStopInPer:(UIImageView *)imageView{
[imageView removeFromSuperview];
UILabel * label = [[UILabelalloc] init];
label.frame = imageView.frame;
label.backgroundColor = [UIColorredColor];
label.text = @"动画已结束!!!";
label.textColor = [UIColorwhiteColor];
label.textAlignment =NSTextAlignmentCenter;
label.font = [UIFontfontWithName:@"Arial-BoldMT"size:29];
[NSTimerscheduledTimerWithTimeInterval:2target:selfselector:@selector(annotationLabel:)userInfo:label repeats:YES];
[self.viewaddSubview:label];
}
到这里还需要注意的是:
(1)如果调用的selector不接受参数则,withObject:nil
(2) 通过performSelector:withObjcet:afterDelay调用的方法不能有返回值
- (void)mainMethod
{
[self performSelectorOnMainThread:@selector(delayMethod) withObject:nil waitUntilDone:YES];
NSLog(@"调用方法==开始");
sleep(5);
NSLog(@"调用方法==结束");
}
- (void)delayMethod
{
NSLog(@"执行延迟方法");
}
执行结果:
2016-07-08 15:41:33.744 GITButtonDemo[841:24412] 执行延迟方法
2016-07-08 15:41:33.745 GITButtonDemo[841:24412] 调用方法==开始
2016-07-08 15:41:38.749 GITButtonDemo[841:24412] 调用方法==结束
还有就是NSTimer也有这样的方法
//imageView.animationDuration*imageView.animationRepeatCount(10*5)之后,就会调用
[NSTimer scheduledTimerWithTimeInterval:imageView.animationDuration*imageView.animationRepeatCounttarget:selfselector:@selector(onImageStop:)userInfo:imageViewrepeats:NO];
-(void)onImageStop:(NSTimer *)timer{
UIImageView * imageView = [timer userInfo];
[imageView removeFromSuperview];
UILabel * label = [[UILabelalloc]init];
label.frame = imageView.frame;
label.backgroundColor = [UIColorredColor];
label.text = @"动画已结束!!!";
label.textColor = [UIColorwhiteColor];
label.textAlignment =NSTextAlignmentCenter;
label.font = [UIFontfontWithName:@"Arial-BoldMT"size:29];
[NSTimerscheduledTimerWithTimeInterval:2target:selfselector:@selector(annotationLabel:)userInfo:labelrepeats:YES];
[self.viewaddSubview:label];
}
-(void)annotationLabel:(NSTimer *)timer{
UILabel * label = [timer userInfo];
label.frame = CGRectMake(40, 300, 300, 50);
}