[RxSwift] RxSwift 시작하기
RxSwift
를 예전에 맛만 봤다가..
이번에는 익혀서 프로젝트에 적용하려고, 다시 공부를 시작했습니다.
Rx
어렵다. 어렵다 하는 데.. 저도 뭘 해야 될 지 모르겠더군요.
참 막막합니다.
RxSwift를 정말 해야되나?
잘 모르겠습니다. 😭
iOS 개발을 하려고 하는 데, 생각보다 쉽게 따라할 자료도 찾기 쉽지 않더군요.
개발을 잘하시는 분들은 어떻게 공부 하셨으려나 싶은 궁금증이 있습니다.
전 잘 하지 못하지만,
제가 처음 공부하기 시작한 방법 / 과정을 메모해봤습니다.
처음에 시작한 순서는 크게 4가지 입니다.
- 구글에서 Rx란? RxSwift 관련 블러그를 검색해서 글을 많이 읽어봤습니다.
- RxSwift Github을 받아서 셈플 소스를 실행시켜 테스트, 공부해 봤습니다.
- 좋은 Rx 책을 구입해서, 공부하고 그것을 RxSwift로 변환해보며 공부했습니다. (현재 Swift Rx 좋은 책을 찾기 어렵네요.)
- 하루에 1개의 오퍼레이터를 익혀보자 라는 간단하지만 어려운 목표 정해서 노력해보기
1. 좋은 블러그 / 유튜브!
우선 아는 것이 없으니 초기에는 구글 검색을 통해 여러 글들을 읽어보고, 지인과 대화해보며 정보를 얻었습니다.
우선, RX가 무엇인지 왜 쓰는 지 이해해 보려는 노력을 해보면 좋은 것 같습니다.
RxSwift 란?
기억 나는 좋은
블러그는..
마기님
Wade 님
민소네님
등등 좋은 블러그의 글들이 있었습니다.
유튜브는..
(이 내용은 나중에 추가한 부분입니다. 처음 할때는 곰튀김님 유튜브가 없었던 것 같아요.. 😭)
RxSwift 는 곰튀김님이 짱입니다.!
- 여기 아래 링크에 곰튀김님 링크 (그 외의 학습 링크 포함)를 쉽게 확인할 수 있는 목차가 있습니다.
- https://github.com/ClintJang/awesome-swift-korean-lecture/blob/master/README.md#rxswift
좋은 셈플 소스가 있습니다.
- 실행해보고, 소스도 한 번 확인하고!!
처음에 RxSwift 란 어떤 것 인지 감 잡기 좋습니다.
좋아요!!! 👍
첫 샘플 소소로는 개인 적으로 가장 좋은 것 같습니다.
3. 다른 언어이지만, 좋은 Rx 책을 구입
처음에는 책을 고민했습니다.
RxSwift는 맘에드는 책… 책 자체를 찾기 어렵더군요.
그래서 여쭤보니 제가 좋아하는 분이 추천해주셨어요.
RxJava 책입니다.
정말 좋더군요.
RxMarble 사이트에서 오퍼레이터를 보는 것으로는 처음에는 더 어렵게만 느껴지고..
좋은 블러그 글은 항상 띄워놓을 수가 없어서 ..
필요할 때 좋은 책이 있다는 것이 좋았습니다.
목차 부분을 살짝 접어서.. 언제든지 펴 볼 수 있도록 해두고, 오퍼레이터의 의미를 이해하려고 노력했습니다.
그리고 그 RxJava의 오퍼레이터를 RxSwift로 만들어보는 공부하는 과정을 거쳤습니다.
이때, 나중에도 언제든지 다시 받아 볼 수 있고, 다른 PC에서도 이어서 공부 할 수 있도록 Github을 이용해서, 천천히 하나씩 만들어 보고 Commit 하고.. 의미를 이해할 수 있도록 검색해서 다양한 블러그 내용을 읽어보고..
이렇게 반복하고 있습니다.
- 이제 하고 있는 거죠 ~
4. 간단한 목표
RX 오퍼레이터 들이 많아 보이지만..
하루에 한개씩 코드로 간단하게 만들어보고, 테스트 해보며 이해해보면..
한달이면 주말 빼고, 22개를 익혀 볼 수 있어요.
(100 % 지키진 못하겠지만, 노력하고 있습니다. )
실제 비슷하고, 어느정도 이상을 익히면 프로젝트를 만들어보면서 해도 충분한 것 같습니다.
많기는 정말 많습니다. 😓
(아래의 모든 연산자가 RxSwift에 있는 것은 아닙니다.😭)
Observable 연산자 리스트(알파벳순)
Aggregate
All
Amb
and_
And
Any
apply
as_blocking
asObservable
AssertEqual
asyncAction
asyncFunc
Average
averageDouble
averageFloat
averageInteger
averageLong
blocking
Buffer
bufferWithCount
bufferWithTime
bufferWithTimeOrCount
byLine
cache
case
Cast
Catch
catchError
catchException
collect
collect
(RxScala version ofFilter
)CombineLatest
combineLatestWith
Concat
concat_all
concatMap
concatMapObserver
concatMapTo
concatAll
concatWith
Connect
connect_forever
cons
Contains
controlled
Count
countLong
Create
cycle
Debounce
decode
DefaultIfEmpty
Defer
deferFuture
Delay
delaySubscription
delayWithSelector
Dematerialize
Distinct
distinctKey
distinctUntilChanged
distinctUntilKeyChanged
Do
doAction
doAfterTerminate
doOnCompleted
doOnEach
doOnError
doOnRequest
doOnSubscribe
doOnTerminate
doOnUnsubscribe
doseq
doWhile
drop
dropRight
dropUntil
dropWhile
ElementAt
ElementAtOrDefault
Empty
emptyObservable
empty?
encode
ensures
error
every
exclusive
exists
expand
failWith
Filter
filterNot
Finally
finallyAction
finallyDo
find
findIndex
First
FirstOrDefault
firstOrElse
FlatMap
flatMapFirst
flatMapIterable
flatMapIterableWith
flatMapLatest
flatMapObserver
flatMapWith
flatMapWithMaxConcurrent
flat_map_with_index
flatten
flattenDelayError
foldl
foldLeft
for
forall
ForEach
forEachFuture
forIn
forkJoin
From
fromAction
fromArray
FromAsyncPattern
fromCallable
fromCallback
FromEvent
FromEventPattern
fromFunc0
from_future
from_iterable
fromIterator
from_list
fromNodeCallback
fromPromise
fromRunnable
Generate
generateWithAbsoluteTime
generateWithRelativeTime
generator
GetEnumerator
getIterator
GroupBy
GroupByUntil
GroupJoin
head
headOption
headOrElse
if
ifThen
IgnoreElements
indexOf
interleave
interpose
Interval
into
isEmpty
items
Join
join
(string)jortSort
jortSortUntil
Just
keep
keep-indexed
Last
lastOption
LastOrDefault
lastOrElse
Latest
latest
(Rx.rb version ofSwitch
)length
let
letBind
limit
LongCount
ManySelect
Map
map
(RxClojure version ofZip
)MapCat
mapCat
(RxClojure version ofZip
)map-indexed
mapTo
mapWithIndex
Materialize
Max
MaxBy
Merge
mergeAll
merge_concurrent
mergeDelayError
mergeObservable
mergeWith
Min
MinBy
MostRecent
Multicast
multicastWithSelector
nest
Never
Next
Next
(BlockingObservable version)none
nonEmpty
nth
ObserveOn
ObserveOnDispatcher
observeSingleOn
of
of_array
ofArrayChanges
of_enumerable
of_enumerator
ofObjectChanges
OfType
ofWithScheduler
onBackpressureBlock
onBackpressureBuffer
onBackpressureDrop
OnErrorResumeNext
onErrorReturn
onExceptionResumeNext
orElse
pairs
pairwise
partition
partition-all
pausable
pausableBuffered
pluck
product
Publish
PublishLast
publish_synchronized
publishValue
raise_error
Range
Reduce
reductions
RefCount
Repeat
repeat_infinitely
repeatWhen
Replay
rescue_error
rest
Retry
retry_infinitely
retryWhen
Return
returnElement
returnValue
runAsync
Sample
Scan
scope
Select
(alternate name ofMap
)select
(alternate name ofFilter
)selectConcat
selectConcatObserver
SelectMany
selectManyObserver
select_switch
selectSwitch
selectSwitchFirst
selectWithMaxConcurrent
select_with_index
seq
SequenceEqual
sequence_eql?
SequenceEqualWith
Serialize
share
shareReplay
shareValue
Single
SingleOrDefault
singleOption
singleOrElse
size
Skip
SkipLast
skipLastWithTime
SkipUntil
skipUntilWithTime
SkipWhile
skipWhileWithIndex
skip_with_time
slice
sliding
slidingBuffer
some
sort
sort-by
sorted-list-by
split
split-with
Start
startAsync
startFuture
StartWith
startWithArray
stringConcat
stopAndWait
subscribe
SubscribeOn
SubscribeOnDispatcher
subscribeOnCompleted
subscribeOnError
subscribeOnNext
Sum
sumDouble
sumFloat
sumInteger
sumLong
Switch
switchCase
switchIfEmpty
switchLatest
switchMap
switchOnNext
Synchronize
Take
take_with_time
takeFirst
TakeLast
takeLastBuffer
takeLastBufferWithTime
takeLastWithTime
takeRight
(see also:TakeLast
)TakeUntil
takeUntilWithTime
TakeWhile
takeWhileWithIndex
tail
tap
tapOnCompleted
tapOnError
tapOnNext
Then
thenDo
Throttle
throttleFirst
throttleLast
throttleWithSelector
throttleWithTimeout
Throw
throwError
throwException
TimeInterval
Timeout
timeoutWithSelector
Timer
Timestamp
To
to_a
ToArray
ToAsync
toBlocking
toBuffer
to_dict
ToDictionary
ToEnumerable
ToEvent
ToEventPattern
ToFuture
to_h
toIndexedSeq
toIterable
toIterator
ToList
ToLookup
toMap
toMultiMap
ToObservable
toSet
toSortedList
toStream
ToTask
toTraversable
toVector
tumbling
tumblingBuffer
unsubscribeOn
Using
When
Where
while
whileDo
Window
windowWithCount
windowWithTime
windowWithTimeOrCount
windowed
withFilter
withLatestFrom
Zip
zipArray
zipWith
zipWithIndex
++
+:
:+
후아~ 많다…
많이 만들어 본 만큼, RxSwift에 대한 자신감도 상승할 거라 믿고 있습니다.
파이팅!
이 글을 쓴지 2개월 정도 지났네요.. RxSwift를 해보면서..
왜? RxSwift
를 사용하면 좋을까??? 에 대한 생각을 메모해 봤습니다.
(요즘에는 매일매일 하나씩 만들어보기를 못하고 있네요😭😭 )
좋은 하루되세요. 🙇