http://www.vincenttsai.com/reactivecocoa-racsequence/ ReactiveCocoa – RACSequence介紹



Leave a reply




RactiveCocoa中很重要的兩個class,一個是RACSignal,一個是RACSequence,而這兩個class的super class就是RACStream。 RACSequence很類似Objective-C中的NSDictionary或者NSArray,你可以利用一些方法來達到將NSDictionary或者NSArray中的值進行一些過濾及轉換。

以一個簡單的例子,我們欲將一個陣列,其內容有1-5,我們只要取出偶數的元素,而且要將值進行平方的動作。這是一般的寫法






1



2



3



4



5



6



7



8



9



10



11



12



   

NSArray                     *numbers                     =                     @          [          @          (          1          )          ,          @          (          2          )          ,          @          (          3          )          ,          @          (          4          )          ,          @          (          5          )          ]          ;


            NSMutableArray                     *results                     =                     [          NSMutableArray                     array          ]          ;


              for                     (          NSNumber                     *value                     in                     numbers          )                     {


                  //過濾掉奇數


                  if                     (                     [          value           intValue          ]                     %          2                     !=                     0                      )          {


                      continue          ;


                  }


                  //取平方值後加入另一個array


                  long                     square                     =                     [          value           intValue          ]                     *                     [          value           intValue          ]          ;


                  [          results           addObject          :          @          (          square          )          ]          ;


              }


              NSLog          (          @"results = %@"          ,          result          )          ;




 

我們會利用RACStream中定義的其中兩個方法






1



2



-                     (          instancetype          )          filter          :          (          BOOL                     (          ^          )          (          id                     value          )          )          block          ;           //過濾掉不要的值


-                     (          instancetype          )          map          :          (          id                     (          ^          )          (          id                     value          )          )          block          ;           //將值進行轉換




這是利用RACSequence的寫法






1



2



3



4



5



6



7



8



9



10



11



12



13



   

NSArray                     *numbers                     =                     @          [          @          (          1          )          ,          @          (          2          )          ,          @          (          3          )          ,          @          (          4          )          ,          @          (          5          )          ]          ;


              NSArray                     *result                     =                     [          [          [          [          numbers           rac_sequence          ]                      //將NSArray轉成 RACSequence


                   //filter方法可以過濾掉不要的值


  filter          :          ^          BOOL          (          NSNumber                     *value          )                     {                     


                   //只留偶數,回傳YES,表示該值要留下


                   return                     [          value           intValue          ]                     %          2                     ==          0          ;


                   //map可以將值再進行轉換


                }          ]           map          :          ^          id          (          NSNumber                     *value          )                     {                          


                   //將傳入的值平方


                   long                     square                     =                     [          value           intValue          ]                     *                     [          value           intValue          ]          ;


                   return                     @          (          square          )          ;


                }          ]           array          ]          ;                              //將RACSequence轉成NSArray


              NSLog          (          @"results = %@"          ,          result          )          ;                                   //Array中的值為 4,16




初次看起來括號會很怪,filter方法回傳為instancetype,也就是如果Receiver是RACSequence物件呼叫filter,就會回傳RACSequence物件(如果是RACSignal呼叫filter,也一樣是回傳一個RACSignal),這個回傳的RACSequence中就只剩兩個值,一個是2另一個是4,再針對這個Sequence呼叫map進行值的轉換,就可以取得最後的結果。這種利用functional programming的程式是否比較直覺我想見人見智,一開始我也不太習慣,但後來從程式閱讀的角度出發其實反而比較容易理解,在程式開發的過程中也會比較容易專心在開發程式的羅輯中。其餘的還有一些function,例如flattern及ConcatenatingCocoa也有興趣,歡迎在下方留言一起交流。