Я пытаюсь передать данные через userInfo для вызова NSTimer. Что лучший способ состоит в том, чтобы сделать это? Я пытаюсь использовать NSDictionary, это достаточно просто, когда у меня есть объекты Objective C, но что относительно других данных? Я хочу сделать что-то вроде этого, которое не работает, как:
- (void)play:(SystemSoundID)sound target:(id)target callbackSelector:(SEL)selector
{
NSLog(@"pause ipod");
[iPodController pause];
theSound = sound;
NSMutableDictionary *cb = [[NSMutableDictionary alloc] init];
[cb setObject:(id)&sound forKey:@"sound"];
[cb setObject:target forKey:@"target"];
[cb setObject:(id)&selector forKey:@"selector"];
[NSTimer scheduledTimerWithTimeInterval:0
target:self
selector:@selector(notifyPause1:)
userInfo:(id)cb
repeats:NO];
}
Вы не должен приводить ваши объекты к id при назначении словарю. Любой объект, который может быть встроен непосредственно в NSDictionary
, уже является производным от NSObject
и неявно признан приведенным к id.
Сохраните имя селектора как NSString
(с использованием NSStringFromSelector ()
), а затем преобразовать его обратно в селектор с помощью NSSelectorFromString ()
Клаус
Ваш вызов правильный, но вам не нужно преобразовывать словарь в id. Вы можете вернуть userInfo с помощью следующей строки в вашем методе notifyPause1::
- (void)notifyPause1:(NSTimer *)timer {
NSDictionary *dict = [timer userInfo];
}
sound
и селектор
не являются объектами Objective-C: sound
- это беззнаковое число, а селектор
- указатель на структуру C. Это может вызвать какой-то сбой.
Вы захотите использовать NSValue для хранения значения для селектора
и NSNumber для хранения значения для звука
. NSValue и NSNumber являются объектами и будут работать с NSMutableDictionary.
Вы должны правильно завернуть информацию в словарь:
- (void) play:(SystemSoundID)sound target:(id)target callbackSelector:(SEL)selector
{
NSLog(@"pause ipod");
[iPodController pause];
theSound = sound;
NSMutableDictionary *cb = [[NSMutableDictionary alloc] init];
[cb setObject:[NSNumber numberWithInt:sound] forKey:@"sound"];
[cb setObject:target forKey:@"target"];
[cb setObject:NSStringFromSelector(selector) forKey:@"selector"];
[NSTimer scheduledTimerWithTimeInterval:0
target:self
selector:@selector(notifyPause1:)
userInfo:cb
repeats:NO];
[cb release];
}
В notifyPause1:
вы извлекаете все:
- (void)notifyPause1:(NSTimer *)timer {
NSDictionary *dict = [timer userInfo];
SystemSoundID sound = [[dict objectForKey:@"sound"] intValue];
id target = [dict objectForKey:@"target"];
SEL selector = NSSelectorFromString([dict objectForKey:@"selector"]);
// Do whatever...
}
Поскольку таймер является повторяющимся, вам больше не нужен словарь, поэтому вы можете его освободить.