【发布时间】:2014-08-16 09:24:44
【问题描述】:
我正在学习 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]附加到信号中,以便 UI 真正重绘。更多详情at the bottom of this post
标签: reactive-cocoa