【问题标题】:Is it possible to change an NSTimer's userInfo?是否可以更改 NSTimer 的用户信息?
【发布时间】:2011-11-30 04:10:08
【问题描述】:
我有一个NSTimer,它的NSNumber 中有一个userInfo
fireTimer = [NSTimer scheduledTimerWithTimeInterval:6.0
target:self
selector:@selector(fireTileAddingToColumn:)
userInfo:myNumber
repeats:YES];
在NSTimer 创建并运行了几次之后,我希望能够更改myNumber 的值并让它反映在fireTileAddingToColumn: 中我没有任何运气让它工作.有人有什么建议吗?
【问题讨论】:
标签:
objective-c
ios
nstimer
foundation
【解决方案1】:
您始终可以将保存 userInfo 的对象传递给计时器:
@interface Holder
@property id data;
-(id) initWithData: (id) data;
@end
// implement it
Holder *holder = [[Holder alloc] initWithData:myNumber];
fireTimer = [NSTimer scheduledTimerWithTimeInterval:6.0 target:self
selector:@selector(fireTileAddingToColumn:) holder
repeats:YES];
[Holder setData: myNumber2];
并且数据变化会反映在选择器中
【解决方案2】:
您最好创建一个新计时器。如果该类不提供用于更改该属性的接口,则应将其视为私有且只读。
在这种情况下,甚至不可能使用 KVC 进行通常的结束运行:
[timer setValue:newNumber forKey:@"userInfo"];
因为NSTimer 不符合该密钥的 KVC 标准。
【解决方案3】:
NSTimer 的 userInfo 属性并不是一个通用的数据存储工具。它的存在是为了让你的定时器有一些上下文,这样如果多个定时器调用相同的动作,定时器的目标就可以将一个定时器与另一个定时器区分开来。
【解决方案4】:
懒人的可变userInfo:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:6.0
target:self
selector:@selector(fireTileAddingToColumn:)
userInfo:@{@"mutable": [@{@"key": <value>} mutableCopy]
repeats:YES];
并访问它:
timer.userInfo[@"mutable"][@"key"] = <newValue>;