http://www.vincenttsai.com/reactivecocoa-racsequence/
ReactiveCocoa – RACSequence介紹
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中定義的其中兩個方法
|
-
(
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及Concatenating,可以參考ReactiveCocoa Document。
下次會主要分享RACSignal,這個才是最常用到的功能。如果你對ReactiveCocoa也有興趣,歡迎在下方留言一起交流。