RACCommand初始化程序信号未命中executionSignals

Eli*_*ins 4 objective-c reactive-programming ios reactive-cocoa

我一直在研究MVVM示例,使用ReactiveCocoa,它是集合视图中App.net帖子的简单集合,在收集集合视图的边缘之前加载更多帖子.

但是,我遇到了一个问题,我的视图模型上有一个命令.我创建了一个命令,通过AFNetworking客户端加载帖子,并在建模后回复.完成后,它会将响应发送到创建的命令的信号,并完成信号.

self.loadPostsCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [[EPHTTPClient sharedClient] getGlobalTimelinePostsWithSuccess:^(NSURLSessionDataTask *task, id responseObject) {
            [self.posts addObjectsFromArray:responseObject];
            [subscriber sendNext:responseObject];
            [subscriber sendCompleted];
        } failure:^(NSURLSessionDataTask *task, NSError *error) {
            [subscriber sendError:error];
        }];

        return nil;
    }];
}];
Run Code Online (Sandbox Code Playgroud)

在我看来,我创建了一个信号来发送剩余的帖子数.

@weakify(self);

RACSignal *postsRemainingSignal = [[RACObserve(self.collectionView, contentOffset) map:^(id value) {
    // The value returned from the signal will be an NSValue
    CGPoint offset = [value CGPointValue];
    NSNumber *postsPassed = @(floorf(offset.x/320) + 1);

    return @([self.postQueue.posts count] - [postsPassed integerValue]);
}] distinctUntilChanged];
Run Code Online (Sandbox Code Playgroud)

我将这些值发送到我的视图模型上的主题.

// Send the values of the posts to the view model
[postsRemainingSignal subscribeNext:^(id x) {
    [self.postQueue.postsRemainingSubject sendNext:x];
}];

// When the load command is executed, update our view accordingly
[self.postQueue.loadPostsCommand.executionSignals subscribeNext:^(RACSignal *loadSignal) {
    [loadSignal subscribeCompleted:^{
        @strongify(self);
        [self.collectionView reloadData];
    }];
}];
Run Code Online (Sandbox Code Playgroud)

视图模型中的主题实例化为:

// Create a subject to send view values to
self.postsRemainingSubject = [RACSubject subject];

// Load more posts when less than 4 posts remain
[self.postsRemainingSubject subscribeNext:^(id x) {
    if ([x integerValue] < 4) {
        [self.loadPostsCommand execute:nil];
    }
}];
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,除了向我的命令信号发送值和完成.网络请求发生,我的帖子被建模,但是,视图从不接收self.postQueue.loadPostsCommand.executionSignals信号上的任何值.

同样,我的项目是在分支重载信号返工的GitHub上.有什么想法吗?

Dav*_*Lee 5

问题是你executionSignals在发送之后订阅postsRemainingSubject(这是最终导致-execute:被调用的东西).

如果您将订阅移动到executionSignals发送的块之上postsRemainingSubject,那么您将看到订阅块被调用.