ios - RACCommand 初始值设定项信号未命中 executingSignals

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

我一直在研究 MVVM example ,使用 ReactiveCocoa,它是一个 Collection View 中的 App.net 帖子的简单集合,它在到达 Collection View 的边缘之前加载更多帖子。

但是,我的 View 模型上的命令有问题。我创建了一个命令,通过 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];

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

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

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

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

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

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

最佳答案

问题是您在发送到 postsRemainingSubject 之后订阅了 executionSignals(这是最终导致 -execute: 的原因)称为)。

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

关于ios - RACCommand 初始值设定项信号未命中 executingSignals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19522656/

相关文章:

ios - 即使在小代码示例中将 unowned 与 Protocol 一起使用时也会发生 Swift Leak

objective-c - iOS:Xcode 4.2:Leaks Instrument 说我的 NSMutableArray 和 NSMutableDictionary 有泄漏,但我看不到哪里

iphone - viewWillAppear 在 iOS5 中被调用两次

ios - MapKit,使用按钮将图钉放在一个位置

reactive-programming - 如何使用/控制 RxJava Observable.cache

python-3.x - 如何使用 rxpy/rxjs 延迟事件发射?

java - Mono/Flux 可以重用/它们是不可变的+无状态的吗?

ios - 使用 VNRectangleObservation 裁剪 UIImage

iphone - 在设备上运行收到 "Finish running on device"消息但从未运行

iphone - UITabbarController + ABPeoplePickerNavigationController 无法正常工作