2014-03-25 34 views
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並返回它的值,但這在我看來並不是正確的方式。

任何燈將不勝感激。

回答

2

從命令的信號塊中刪除對-[RACSignal materialize]的呼叫。

+0

它的工作原理!你能解釋一下主要區別是什麼?只是爲了更好地理解框架。 – asheinfeld

+0

順便說一句我還刪除了不必要的映射塊 – asheinfeld

+2

信號可以生成三種不同的事件:值(有時稱爲「下一個」),完成和錯誤。如果信號發送完整或錯誤,則訂閱立即終止,並且在該訂閱上永遠不會發送其他值/完整/錯誤。 '-materialize'方法將所有下一步,完成和錯誤轉換爲特殊類型的值(RACEvent)。這使您可以使用僅對值處理的操作,即使是在非值事件(例如'-map:'或'-filter:')。 '-materialize/dematerialize'在極少數情況下很有用,但沒有被廣泛使用。 – erikprice

相關問題