天天看点

iOS基础之NSTimer 以及通知传递参数前言正文参考资料

前言

这篇文章记录了如何使用NSTimer以及通知来给执行的方法传递参数

正文

定时器传参

使用下面一行代码来在指定时间内是否周期性执行指定的方法

[NSTimer scheduledTimerWithTimeInterval: target:self selector:@selector(onTimer:) userInfo:dict repeats:NO]; 
           

可以看到onTimer后面有一个冒号,表示这个方法后面有一个参数。 那么我们如何给这个方法传递参数呢?请看onTimer方法的定义

- (void)onTimer:(NSTimer *)timer 
{  
    UIView *oldView = [[timer userInfo] objectForKey:@"oldView"];
    UIView *newView = [[timer userInfo] objectForKey:@"newView"];  
    [UIView animateWithDuration:  delay:
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^{  
                         oldView.alpha = ; 
                         newView.alpha = ;  
                     }  
} 
           

注意一下这里的onTimer后面的参数,它是通过NSTimer这个类型的参数实例使用

[timer userInfo]

获取上面在

[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(onTimer:) userInfo:dict repeats:NO];

中的userInfo指定的字典变量

important note: 使用[timer userInfo]来获取在userInfo中指定传递的参数时,一定要保证这个NSTimer(也就是上面代码通过

[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(onTimer:) userInfo:dict repeats:NO];

产生的定时器变量) 没有使用

[self.searchTimer invalidate]; self.searchTimer = nil;

来让定时器失效,否则的话会出现EXC_BAD_ACCESS错误

通知传参

定义有参数 的通知

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(specifyModelInfoPrinting:) name:@"specifyModelInfoPrinting" object:nil];
           

specifyModelInfoPrinting方法带一个NSNotification参数

- (void)specifyModelInfoPrinting:(NSNotification *)notice {
    self.nonLabel.hidden = YES;
    self.printProgressView.hidden = NO;
    self.printingDictInfomation = [notice userInfo];
}
           

使用NSNotification类型实例变量通过代码[notice userInfo]获取下面在userInfo指定的参数变量

[[NSNotificationCenter defaultCenter]postNotificationName:@"specifyModelInfoPrinting" object:nil userInfo:stlDict];
           

这里给userInfo指定的是一个字典,因此使用[notice userInfo]获取到的就是一个字典变量

performSelector传参

-(void) showMessageToUI:(NSString*) message {
    MBProgressHUD *progress = [MBProgressHUD showHUDAddedTo:self animated:NO];
    progress.labelText = message;
    [self performSelector:@selector(hideHUD:) withObject:progress afterDelay:];
}
-(void) hideHUD:(MBProgressHUD*) progress {
    __block MBProgressHUD* progressC = progress;
    dispatch_async(dispatch_get_main_queue(), ^{
        [progressC hide:YES];
        progressC = nil;
    });
}
           

从上面的代码可以知道,withObject后面跟上什么类型的变量,那么在对应执行方法后面就赋予什么类型的参数,⚠️:这里参数只能有一个,如果想要传递多个参数,那么存放到字典或者数组然后再传递

参考资料

通过NSTimer看IPhone对@selector的函数如何传参数