2013-10-22 54 views
4

我一直在使用一个MVVM example,使用ReactiveCocoa,它是一个集合视图中的App.net帖子的简单集合,它在点击集合视图的边缘之前加载更多的帖子。RACCommand初始化器信号没有命中执行信号

但是,我有一个问题,在我的视图模型上有一个命令。我已经创建了一个通过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。有什么想法吗?

+0

你能更新你的回购?我试图深入研究这个问题,但回购的代码与此问题中的代码不同。 –

+0

检查分支reload-signal-rework这里:https://github.com/eliperkins/MVVMExample/tree/reload-signal-rework –

+1

我看不懂,请接受道歉。 –

回答

5

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

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

+0

谢谢!这工作完美。这是这个主题的恰当用例吗?我注意到RACs文档说要回避主题... –

+0

而不是在这种情况下使用的主题,你可以使用传统的属性。将'-sendNext:'替换为该属性的赋值,并将所有订户替换为订户到'RACObserve(obj,property)'的主体。那有意义吗? –