вызов метода с NSDictionary (userInfo) - PullRequest
0 голосов
/ 23 марта 2012

У меня есть таймер

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");}

Теперь у меня вопрос, как вызвать метод напрямую? Мне нужно включить его сразу, не только по прошествии времени, поэтому я хотел позвонить. Однако этот метод возвращает сбой ([__NSCFDictionary userInfo]: нераспознанный селектор отправлен в экземпляр):

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

Ответы [ 4 ]

4 голосов
/ 23 марта 2012

Как предположил Виньеш, вы можете просто вызвать NSTimer с интервалом времени 0. Однако это может вызвать проблемы в будущем.

Было бы лучше иметь функцию, которая выполняет обработку,

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

И затем есть метод таймера

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

Таким образом, вы можете затем вызывать его через таймер, как в настоящее время, или вызывать его напрямую[self doProcessing:data]

Если вы сделаете это таким образом, вы окажетесь в гораздо лучшем положении, если в будущем вы решите, что после выполнения обработки вы захотите переназначить таймер в соответствии с определенными условиями, но только еслибыл вызван через таймер, как вы можете сделать это в вашем методе timerAction.Вы должны попытаться получить функциональность как можно более детализированных методов, поэтому не смешивайте биты, связанные с таймером, с битами обработки.

0 голосов
/ 26 марта 2012

Почему бы не сделать это так, как изначально хотел Виве, но сделать некоторый самоанализ в методе 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);

}

0 голосов
/ 23 марта 2012

Попробуйте это (перед попыткой вызвать селектор):

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];
0 голосов
/ 23 марта 2012

Вы можете сделать это,

[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];
...