pop+rac
- (RACSignal *) rac_animationWithName:(NSString *)name
animation:(POPAnimation *(^)(NSObject *target))animationBlock {
@weakify(self);
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
@strongify(self);
POPAnimation *animation = animationBlock(self);
[self pop_addAnimation:animation forKey:name];
[animation setCompletionBlock:^(POPAnimation *animation, BOOL finished) {
[subscriber sendNext:animation];
// 取消动画、重复或者自动反转的动画会多次调用completion block,
// 因此需要判断动画是否已经结束
if (finished) {
[subscriber sendCompleted];
}
}];
[subscriber sendNext:animation];
@weakify(self);
return [RACDisposable disposableWithBlock:^{
@strongify(self);
// 取消进行中的动画
if ([self pop_animationForKey:name]) {
[self pop_removeAnimationForKey:name];
// 取消动画时,手动发出结束信号
[subscriber sendCompleted];
}
}];
}];
// 在附着的对象销毁时,触发动画结束信号
return [[signal takeUntil:self.rac_willDeallocSignal]
setNameWithFormat:@"%@ -rac_popAnimationSignal", self.rac_description];
}