Можно ли изменить userInfo NSTimer? - PullRequest
1 голос
/ 30 ноября 2011

У меня есть NSTimer с NSNumber в userInfo

fireTimer = [NSTimer scheduledTimerWithTimeInterval:6.0 
                                             target:self 
                                           selector:@selector(fireTileAddingToColumn:) 
                                           userInfo:myNumber 
                                            repeats:YES];

После того, как NSTimer создан и запущен пару раз, я хотел бы иметь возможность изменить значение myNumber и отразить его в fireTileAddingToColumn: Мне не повезло, заставить это работать , У кого-нибудь есть предложения?

Ответы [ 4 ]

3 голосов
/ 30 ноября 2011

Вы всегда можете передать объект, содержащий 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];

, и изменение данных будет отражено в селекторе

3 голосов
/ 30 ноября 2011

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

В этом случае даже невозможно выполнить обычный обход, используя KVC:

[timer setValue:newNumber forKey:@"userInfo"];

, поскольку NSTimer не соответствует KVC для этого ключа.

2 голосов
/ 30 ноября 2011

Свойство userInfo NSTimer не предназначено для хранения данных общего назначения. Это сделано для того, чтобы вы могли иметь некоторый контекст, соответствующий вашему таймеру, чтобы цель таймера могла отличить один таймер от другого, если несколько таймеров вызывают одно и то же действие.

1 голос
/ 25 февраля 2014

Изменчивый ленивый userInfo:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:6.0 
                                         target:self 
                                       selector:@selector(fireTileAddingToColumn:) 
                                       userInfo:@{@"mutable": [@{@"key": <value>} mutableCopy] 
                                        repeats:YES];

И для доступа к нему:

timer.userInfo[@"mutable"][@"key"] = <newValue>;
...