2
我對Reactive Cocoa Framework完全陌生,我只是在做一些簡單的測試,但是我遇到了一個我想了解的問題。Reactive Cocoa:使用RACCommand的HTTPRequest響應
基本上我只是做一個API調用來從我的服務器獲取JSON對象,我想用RAC做到這一點。所以,我的步驟如下:
首先,我建立RACCommand這樣:
RACCommand *getLatestVersionCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
return [[[API sharedInstance] getLatestAppVersion]
materialize];
}];
現在我創建的信號,並訂閱它這樣:
RACSignal *versionCodeSignal = [[getLatestVersionCommand.executionSignals flatten] deliverOn:[RACScheduler mainThreadScheduler]];
[[versionCodeSignal
map:^id(NSDictionary *responseObject) {
return responseObject;
}]
subscribeNext:^(NSDictionary *responseObject) {
NSArray *allVersions = [[NSArray alloc] initWithArray:[responseObject objectForKey:KEY_VERSIONS]];
for(NSDictionary *version in allVersions) {
NSString *device = [version objectForKey:KEY_DEVICE];
if([device isEqualToString:KEY_IOS]) {
NSString *latestVersionName = [[version objectForKey:KEY_VERSION] objectForKey:KEY_NAME];
if([APP_VERSION compare:latestVersionName options:NSNumericSearch] == NSOrderedAscending) {
//There is a new version!
NSLog(@"There is a new version!!!");
}
}
}
}];
最後我這樣執行命令
[getLatestVersionCommand execute:self];
我面臨的問題是,在subscribeNext塊中,我收到的對象是RACEvent對象,而不是我期待的字典。我知道我做錯了什麼,沒有正確理解整個流程,我嘗試添加地圖功能,我認爲我不需要測試,也不需要任何東西。
我發現的唯一方法是將地圖塊中的響應轉換爲RACEvent並返回它的值,但這在我看來並不是正確的方式。
任何燈將不勝感激。
它的工作原理!你能解釋一下主要區別是什麼?只是爲了更好地理解框架。 – asheinfeld
順便說一句我還刪除了不必要的映射塊 – asheinfeld
信號可以生成三種不同的事件:值(有時稱爲「下一個」),完成和錯誤。如果信號發送完整或錯誤,則訂閱立即終止,並且在該訂閱上永遠不會發送其他值/完整/錯誤。 '-materialize'方法將所有下一步,完成和錯誤轉換爲特殊類型的值(RACEvent)。這使您可以使用僅對值處理的操作,即使是在非值事件(例如'-map:'或'-filter:')。 '-materialize/dematerialize'在極少數情況下很有用,但沒有被廣泛使用。 – erikprice