Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Don';在完成之前,不要触发RAC信号副作用_Ios_Iphone_Reactive Cocoa - Fatal编程技术网

Ios Don';在完成之前,不要触发RAC信号副作用

Ios Don';在完成之前,不要触发RAC信号副作用,ios,iphone,reactive-cocoa,Ios,Iphone,Reactive Cocoa,我正在尝试创建一个信号,它将在第一次订阅时触发它的副作用,并为任何后续订阅重播事件。一旦信号发送完成或错误,我想为下一次订阅重新触发副作用。我已经提出了这个解决方案,但我想知道是否有更优雅的方法来解决这个问题 @interface ViewController () @property (nonatomic, assign) NSUInteger counter; @property (nonatomic, strong) RACSignal *defferedIncrement; @end

我正在尝试创建一个信号,它将在第一次订阅时触发它的副作用,并为任何后续订阅重播事件。一旦信号发送完成或错误,我想为下一次订阅重新触发副作用。我已经提出了这个解决方案,但我想知道是否有更优雅的方法来解决这个问题

@interface ViewController ()
@property (nonatomic, assign) NSUInteger counter;
@property (nonatomic, strong) RACSignal *defferedIncrement;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [[self defferedIncrement] subscribeNext:^(id x) {
        NSLog(@"Count: %@", x);
    }];

    [[self defferedIncrement] subscribeNext:^(id x) {
        NSLog(@"Count: %@", x);
    }];
}

- (IBAction)buttonDidTap:(id)sender {
    [[self defferedIncrement] subscribeNext:^(id x) {
        NSLog(@"Count: %@", x);
    }];
}

- (RACSignal *)realIncrement
{
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            RACDisposable *disposable = [RACDisposable new];
            if (disposable.disposed) { return disposable; }

            ++self.counter;

            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    
                [subscriber sendNext:@(self.counter)];
                [subscriber sendCompleted];
            });

            return disposable;
    }];
}

- (RACSignal *)defferedIncrement
{
    if (!_defferedIncrement) {
        _defferedIncrement = [[RACSignal defer:^RACSignal *{
            return [[self realIncrement] finally:^{
                _defferedIncrement = nil;
            }];
        }] replayLazily];
    }

    return _defferedIncrement;
}

@end
@界面视图控制器()
@属性(非原子,赋值)整数计数器;
@特性(非原子,强)RAC信号*差分增量;
@结束
@实现视图控制器
-(无效)viewDidLoad{
[超级视图下载];
[[self-DeferedinCrement]subscribeNext:^(id x){
NSLog(@“计数:%@”,x);
}];
[[self-DeferedinCrement]subscribeNext:^(id x){
NSLog(@“计数:%@”,x);
}];
}
-(iAction)按钮选项卡:(id)发送者{
[[self-DeferedinCrement]subscribeNext:^(id x){
NSLog(@“计数:%@”,x);
}];
}
-(RACSignal*)实增量
{
返回[RACSignal createSignal:^RACSignal*(id订户){
RACDisposable*disposable=[RACDisposable new];
if(disposable.disposed){return disposable;}
++自动计数器;
调度时间(现在调度时间,(int64_t)(每秒3*NSEC_)),调度获取主队列()
[用户发送下一步:@(自助柜台)];
[用户发送完成];
});
一次性退货;
}];
}
-(RAC信号*)差分增量
{
如果(!\u差异增量){
_微分增量=[[RACSignal defer:^RACSignal*{
返回[[self realIncrement]最后:^{
_微分增量=零;
}];
}]可重复];
}
返回差分增量;
}
@结束