【问题标题】:RACCommand initializer signal doesn't hit executingSignalsRACCommand 初始化器信号未命中正在执行的信号
【发布时间】:2013-10-22 15:52:20
【问题描述】:

我一直在处理MVVM example,使用 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;
    }];
}];

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

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

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

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

视图模型中的主题是这样实例化的:

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

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

同样,my project is on GitHub 在分支 reload-signal-rework 中。有什么想法吗?

【问题讨论】:

标签: ios objective-c reactive-programming reactive-cocoa


【解决方案1】:

问题是您在发送到postsRemainingSubject 之后订阅了executionSignals(这最终导致-execute: 被调用)。

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

【讨论】:

  • 谢谢!这非常有效。这是此处主题的正确用例吗?我注意到 RAC 文档说要回避主题...
  • 在这种情况下,您可以使用常规属性,而不是使用主题。将-sendNext: 替换为对该属性的分配,并将该主题的所有订阅者替换为RACObserve(obj, property) 的订阅者。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多