huix9527
7/10/2015 - 10:58 AM

pop+rac

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];
}