2013-10-22 52 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)'的主體。那有意義嗎? –