Передача данных через NSTimer UserInfo

Я пытаюсь передать данные через 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];
}
27
задан Thromordyn 13 August 2012 в 14:47
поделиться

4 ответа

Вы не должен приводить ваши объекты к id при назначении словарю. Любой объект, который может быть встроен непосредственно в NSDictionary , уже является производным от NSObject и неявно признан приведенным к id. Сохраните имя селектора как NSString (с использованием NSStringFromSelector () ), а затем преобразовать его обратно в селектор с помощью NSSelectorFromString ()

Клаус

0
ответ дан 28 November 2019 в 04:38
поделиться

Ваш вызов правильный, но вам не нужно преобразовывать словарь в id. Вы можете вернуть userInfo с помощью следующей строки в вашем методе notifyPause1::

- (void)notifyPause1:(NSTimer *)timer {

    NSDictionary *dict = [timer userInfo];

}
7
ответ дан 28 November 2019 в 04:38
поделиться

sound и селектор не являются объектами Objective-C: sound - это беззнаковое число, а селектор - указатель на структуру C. Это может вызвать какой-то сбой.

Вы захотите использовать NSValue для хранения значения для селектора и NSNumber для хранения значения для звука . NSValue и NSNumber являются объектами и будут работать с NSMutableDictionary.

2
ответ дан 28 November 2019 в 04:38
поделиться

Вы должны правильно завернуть информацию в словарь:

- (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...
}

Поскольку таймер является повторяющимся, вам больше не нужен словарь, поэтому вы можете его освободить.

49
ответ дан 28 November 2019 в 04:38
поделиться