Я изучаю ReactiveCocoa, и меня ставит в тупик следующее:
Если я привяжу этот сигнал к метке:
-(void)viewDidLoad{
[super viewDidLoad];
RAC(self.currentTimeLabel, text) = self.timeAgoSignal;
}
-(RACSignal *)timeAgoSignal{
return [[[RACSignal interval:1 onScheduler:[RACScheduler scheduler]] startWith:[NSDate date]] map:^id (NSDate *value) {
NSLog (@"Value: %@", value);
return value.description;
}];
}
Во-первых, метка не обновляется (меня это не беспокоит, наверное, я могу понять, почему). Мой главный вопрос: как блок регистрирует обновленную дату для каждого тика?
Value: 2014-08-16 09:15:40 +0000
Value: 2014-08-16 09:15:41 +0000
Value: 2014-08-16 09:15:42 +0000
Value: 2014-08-16 09:15:43 +0000
Это удивительно для меня. Если бы у меня был таймер, выводящий [дата NSDate], он, конечно, не менялся бы на каждом тике:
-(instancetype)init{
if (self = [super init]) {
_date = [NSDate date];
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector (output) userInfo:nil repeats:YES];
}
return self;
}
-(void)output{
NSLog (@"Date: %@", self.date);
}
Выход:
Date: 2014-08-16 09:19:36 +0000
Date: 2014-08-16 09:19:36 +0000
Date: 2014-08-16 09:19:36 +0000
Date: 2014-08-16 09:19:36 +0000
Что является ожидаемым поведением.
Если бы startWith:[NSDate date]
был в блоке, который вызывается заново на каждом тике, то я мог бы понять. Но это не так:
Например, если я вместо этого использую startWith:[self date]
, я вижу, что [self date]
вызывается только один раз, так что это не волшебный вызов этого метода каждый раз, как и ожидалось.
Никакой код, который я вижу, не увеличивает дату вручную. Итак, как это происходит?
deliverOn:[RACScheduler mainThreadScheduler]
к сигналу, чтобы пользовательский интерфейс действительно перерисовывался. Подробнее в нижней части этого сообщения - person Ian Dundas   schedule 16.08.2014