使用NSDictionary(userInfo)调用方法

时间:2012-03-23 10:40:11

标签: iphone objective-c ios cocoa nstimer

我有一个计时器

myTimer = [NSTimer scheduledTimerWithTimeInterval:x target:self selector:@selector(timerAction:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:y, @"y", z, @"z", nil] repeats:YES];

和方法:

-(void)timerAction:(NSTimer *)theTimer {
SomeObject *y = [[theTimer userInfo] objectForKey:@"y"];
SomeObject *z = [[theTimer userInfo] objectForKey:@"z"];
{etc...}
NSLog(@"Done");}

现在我的问题是如何直接调用该方法?我不仅需要在x时间过后立即打开它,所以我想打电话给它。但是这个方法返回崩溃([__ NSCFDictionary userInfo]:发送到实例的无法识别的选择器):

[self performSelector:@selector(timerAction:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:y, @"y", z, @"z", nil]];

4 个答案:

答案 0 :(得分:4)

正如Vignesh建议的那样,您可以以0的时间间隔调用NSTimer。但是,这可能会在将来引发问题。

你最好有一个执行处理的功能,

-(void)doProcessing:(NSDictionary *)theData {...

然后有一个计时器方法

-(void)timerAction:(NSTimer *)timer {
[self doProcessing:[timer userInfo]];
}

所以你可以像现在一样通过计时器调用它,或者你可以用[self doProcessing:data]

直接调用它

如果你这样做,那么如果将来你决定在完成处理之后你想要根据某些条件重新安排计时器,但只有当它通过计时器调用时才会更好。然后,您可以在timerAction方法中执行此操作。您应该尝试将功能尽可能地用于细粒度方法,因此不要将与计时器相关的位与处理位混合。

答案 1 :(得分:0)

尝试此操作(在尝试调用选择器之前):

NSTimer* t = [[NSTimer alloc] init];
[[t userInfo] setObject:y forKey:@"y"];
[[t userInfo] setObject:x forKey:@"x"];

然后通过以下方式调用它:

[self performSelector:@selector(timerAction:) withObject:t];

或:

[self timerAction:t];

答案 2 :(得分:0)

为什么不像Vive原来那样做,但是在timerAction方法中做一些内省来看看参数是什么类:

-(void)timerAction:(id) param {
NSDictionary *dict = [param isKindOfClass:[NSDictionary class]]? param : [(NSTimer *)param userInfo];
id y = [dict objectForKey:@"y"];
id z = [dict objectForKey:@"z"];
NSLog(@"%@  %@",y,z);

}

答案 3 :(得分:-1)

你可以这样做,

[NSTimer scheduledTimerWithTimeInterval:0 target:self selector:@selector(timerAction:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:y, @"y", z, @"z", nil] repeats:NO];
myTimer = [NSTimer scheduledTimerWithTimeInterval:x target:self selector:@selector(timerAction:) userInfo:[NSDictionary dictionaryWithObjectsAndKeys:y, @"y", z, @"z", nil] repeats:YES];