ÏàÐÅÔÚ¹ýÈ¥µÄÒ»¶Îʱ¼äÀ¶Ô
RxSwift ¶àÉÙÓйý½Ó´¥»ò¶úÎÅ£¬»òÕßÒѾ»ýÀÛÁ˲»ÉÙʵս¾Ñé¡£´ËÎÄÖ÷ÒªÕë¶ÔÄÇЩÔÚÃÅ¿ÚÅÇ»²£¬Ïë½øÓÖÅIJȿӵÄͬѧ¡£
ΪʲôҪѧϰ RxSwift
µ±¾ö¶¨×öÒ»¼þÊÂÇéʱ£¬ÖÁÉÙÒªÖªµÀΪʲô¡£RxSwift ¹ÙÍø¾ÙÁ˼¸¸öÀý×Ó£¬±ÈÈç¿ÉÒÔͳһ´¦Àí Delegate,
KVO, Notification£¬¿ÉÒÔ°ó¶¨ UI£¬·½±ãÍøÂçÇëÇóµÄ´¦ÀíµÈµÈ¡£µ«ÕâЩ¸ü¶àµÄÊÇÃèÊö¿ÉÒÔÓà RxSwift
À´×öʲô£¬¸úΪʲôҪʹÓà RxSwift »¹ÊÇ»áÓе㲻ͬ¡£
ÎÒÃÇÏÈÀ´·ÖÎöÏ GUI ±à³ÌµÄ±¾ÖÊ£¬ÎÒϲ»¶°ÑËü³éÏóΪÊÓͼºÍÊý¾ÝµÄ½áºÏ¡£ÆäÖÐÊÓͼ¸ºÔðÁ½¼þÊ£ºÕ¹Ê¾ºÍ½»»¥£¬Õ¹Ê¾Ê²Ã´ÓÉÊý¾Ý¾ö¶¨¡£

ÆäÖе¥ÏòÊý¾ÝÁ÷¿ÉÒÔͨ¹ý֮ǰ½éÉÜµÄ ReSwift Íê³É¡£¿´ÆðÀ´ºÃÏñû RxSwift ʲôÊÂÇ飬Æäʵ²»È»£¬RxSwift
¿ÉÒÔÔÚ UniDirectional Data Flow µÄ¸÷¸ö½×¶Î¶¼·¢»Ó×÷Ó㬴ӶøÈà Data µÄ´¦ÀíºÍÁ÷¶¯¸ü¼Ó¼ò½àºÍÇåÎú¡£

ͨ¹ý¶Ô RxCocoa µÄ¸÷Öֻص÷½øÐÐͳһ´¦Àí£¬·½±ãÁË¡¸Interact¡¹µÄ´¦Àí¡£
ͨ¹ý¶Ô Observable µÄ transform ºÍ composite£¬·½±ãÁË Action µÄÉú³É£¨±ÈÈçʹÓÃ
throttle À´Ñ¹Ëõ Action£©¡£
ͨ¹ý¶ÔÍøÂçÇëÇóÒÔ¼°ÆäËûÒì²½Êý¾ÝµÄ»ñÈ¡½øÐÐ Observable ·â×°£¬·½±ãÁËÒì²½Êý¾ÝµÄ´¦Àí¡£
ͨ¹ý RxCocoa µÄ binding£¬·½±ãÁËÊý¾ÝµÄäÖȾ¡£
ËùÒÔ ReSwift ¹æ·¶ÁËÊý¾ÝÁ÷£¬RxSwift ΪÊý¾ÝµÄ´¦ÀíÌṩÁË·½±ã£¬ÕâÁ½¸öÀà¿âµÄ½áºÏ£¬¿ÉÒÔ²úÉúÇåÎúµÄ¼Ü¹¹ºÍÒ×ά»¤µÄ´úÂë¡£
µ±È»£¬Ç°ÌáÊǶÔËüÃÇÓÐ×ã¹»µÄÁ˽⣬ÓÈÆäÊÇ RxSwift£¬Ò²¾ÍÊÇÎÒÃǽñÌìµÄÖ÷½Ç¡£
ʲôÊÇ RxSwift
ÔÚ GUI ±à³ÌÖУ¬ÎÒÈÏΪ±È½Ï¸´ÔÓµÄÓÐÈý¸ö²¿·Ö£º
·ÇÔÉú UI Ч¹ûµÄʵÏÖ£¨±ÈÈç²úÆ·¾ÀíÃǾ³£Ã°³öÀ´µÄ¸÷ÖÖÏë·¨£©¡£
´óÁ¿×´Ì¬µÄά»¤¡£
Òì²½Êý¾ÝµÄ´¦Àí¡£
1£©²»ÔÚÕâ´ÎµÄÌÖÂÛ·¶³ë£¨ÕâÀïµÄѧÎÊÒ²ºÜ¶à£¬±ÈÈçÁ÷³©ÐÔºÍÐÔÄÜ£©¡£2) ¿ÉÒÔͨ¹ýµ¥ÏòÊý¾ÝÁ÷À´½â¾ö£¨½áºÏ Immutable
Data£©¡£3) ¿ÉÒÔͨ¹ý RxSwift À´½â¾ö¡£ÄÇô RxSwift ÊÇÈçºÎ´¦ÀíÒì²½Êý¾ÝµÄÄØ£¿
ÔÚ˵ RxSwift ֮ǰ£¬ÏÈÀ´ËµÏ Rx£¬ ReactiveX ÊÇÒ»ÖÖ±à³ÌÄ£ÐÍ£¬×î³õÓÉ΢Èí¿ª·¢£¬½áºÏÁ˹۲ìÕßģʽ¡¢µü´úÆ÷ģʽºÍº¯Êýʽ±à³ÌµÄ¾«»ª£¬À´¸ü·½±ãµØ´¦ÀíÒì²½Êý¾ÝÁ÷¡£ÆäÖÐ×îÖØÒªµÄÒ»¸ö¸ÅÄîÊÇ
Observable¡£
¾Ù¸ö¼òµ¥µÄÀý×Ó£¬µ±±ðÈËÔÚ¸úÄã˵»°Ê±£¬Äã¾ÍÊÇÄǸö¹Û²ìÕߣ¬±ðÈ˾ÍÊÇÄǸö Observable£¬ËüÓм¸¸öÌØµã£º
¿ÉÄܻ᲻¶ÏµØ¸úÄã˵»°¡££¨onNext:£©
¿ÉÄÜ»á˵´í»°¡££¨onError:£©
½áÊø»á˵»°¡££¨onCompleted£©
ÄãÔÚÌýµ½¶Ô·½ËµµÄ»°ºó£¬Ò²¿ÉÒÔÓм¸ÖÖ·´Ó¦£º
1.¸ù¾Ý˵µÄ»°£¬×öÏàÓ¦µÄÊ£¬±ÈÈç¶Ô·½ÈÃÄã½è±¾Ê鏸Ëû¡££¨subscribe£©
2.°Ñ¶Ô·½ËµµÄ»°£¬¼Ó¹¤ÏÂÔÙ´«´ï¸øÆäËûÈË£¬±ÈÈç¶Ô·½ËµÐ¡ÕźÃÏñ²»Ì«Êæ·þ£¬Äã´«´ï¸øÆäËûÈËʱ¾Í±ä³ÉÁËСÕÅʧÁµÁË¡££¨map:£©
3.²Î¿¼ÆäËûÈË˵µÄ»°ÔÙ×ö´¦Àí£¬±ÈÈç A ˵ij¼ÒµêºÜºÃ³Ô£¬B ˵ij¼ÒµêÒ»°ã°ã£¬ÄãÐèÒª½áºÏÁ½¸öÈ˵ÄÒâ¼ûÔÙ×ö¶¨¶á¡££¨zip:£©
ËùÒÔ£¬´ÓÉú»îÖÐÒ²ÄÜ¿´µ½ Rx µÄÓ°×Ó¡£¡¸ÓÐЩÊÂÇé¼±²»µÃ£¬ÄãµÃµÈËü×Ô¼ºÊ졹£¬Òì²½£¬Æäʵ¾ÍÊǸúʱ¼ä´ò½»µÀ£¬²»Í¬µÄʱ¼ä£¬Äõ½µÄÊý¾ÝÒ²»á²»Ò»Ñù¡£¿ÉÒÔÔÚÏ߸ÐÊÜÏÂ

ÕâÀïµÄºËÐÄÊǵ±Êý¾ÝÓб仯ʱ£¬Äܹ»Á¢¿ÌÖªÏþ£¬²¢ÇÒͨ¹ý×éºÏºÍת»»ºó£¬¿ÉÒÔ¼´Ê±×÷³öÏìÓ¦¡£ÓеãÏñËþ·À£¬ÏÈÔÚ·Éϵĸ÷¸ö½ÚµãÂñºÃÎäÆ÷£¬È»ºóµÈ×ÅС¹ÖÊÞÃǹýÀ´¡£
RxSwift Workflow
´óÖ·ÖΪÕâô¼¸¸ö½×¶Î£ºÏ顄 Native Object ±ä³É Observable£¬ÔÙͨ¹ý Observable
ÄÚÖõĸ÷ÖÖÇ¿´óµÄת»»ºÍ×éºÏÄÜÁ¦±ä³ÉÐ嵀 Observable£¬×îºóÏû·ÑÐ嵀 Observable µÄÊý¾Ý¡£

Native Object -> Observable
.rx extension
¼ÙÉèÐèÒª´¦Àíµã»÷ʼþ£¬Õý³£µÄ×ö·¨ÊǸø Tap Gesture Ìí¼ÓÒ»¸ö Target-Action£¬È»ºóÔÚÄÇÀïʵÏÖ¾ßÌåµÄÂß¼£¬ÕâÑùµÄÎÊÌâÔÚÓÚÐèÒªÖØÐÂÈ¡Ãû×Ö£¬¶øÇÒ¶ªÊ§ÁËÉÏÏÂÎÄ¡£RxSwift
(È·ÇÐ˵ÊÇ RxCocoa) ¸øÏµÍ³µÄÖî¶àÔÉú¿Ø¼þ£¨°üÀ¨Ïñ URLSession£©ÌṩÁË rx À©Õ¹£¬ËùÒÔµã»÷µÄ´¦Àí¾Í±ä³ÉÁËÕâÑù£º
let tapBackground = UITapGestureRecognizer()
tapBackground.rx.event
.subscribe(onNext: { [weak self] _ in
self?.view.endEditing(true)
})
.addDisposableTo(disposeBag)
view.addGestureRecognizer(tapBackground) |
ÊDz»ÊǼò½àÁ˺ܶࡣ
Observable.create
ͨ¹ýÕâ¸ö·½·¨£¬¿ÉÒÔ½« Native µÄ object °ü×°³É Observable£¬±ÈÈç¶ÔÍøÂçÇëÇóµÄ·â×°£º
public func response(_ request: URLRequest) -> Observable<(Data, HTTPURLResponse)> { return Observable.create { observer in let task = self.dataTaskWithRequest(request) { (data, response, error) in observer.on(.next(data, httpResponse)) observer.on(.completed) }
task.resume()
return Disposables.create {
task.cancel()
}
}
} |
³öÓÚ´úÂëµÄ¼ò½à£¬ÂÔÈ¥ÁË¶Ô error µÄ´¦Àí£¬Ê¹ÓÃ×ËÊÆÀàËÆ
let disposeBag = DisposeBag()
response(aRequest)
.subscribe(onNext: { data in
print(data)
})
.addDisposableTo(disposeBag)
|
ÕâÀïÓÐÁ½¸ö×¢Òâµã£º
Observerable ·µ»ØµÄÊÇÒ»¸ö Disposable£¬±íʾ¡¸¿ÉÈÓµô¡¹µÄ£¬ÈÓÄÄÀïÄØ£¬¾ÍÈÓµ½¸Õ¸Õ´´½¨µÄ´ü×ÓÀÕâÑùµ±´ü×Ó±»»ØÊÕ£¨dealloc£©Ê±£¬»á˳±ãÖ´ÐÐÒ»ÏÂ
Disposable.dispose()£¬Ö®Ç°´´½¨ Disposable ʱÉêÇëµÄ×ÊÔ´¾Í»á±»Ò»²¢Êͷŵô¡£
Èç¹ûÓжà¸ö subscriber À´ subscribe response(aRequest) ÄÇô»á´´½¨¶à¸öÇëÇ󣬴ӴúÂëÒ²¿ÉÒÔ¿´µÃ³öÀ´£¬À´Ò»¸ö
observer ¾Í´´½¨Ò»¸ö task£¬È»ºóÖ´ÐС£ÕâºÜÓпÉÄܲ»ÊÇÎÒÃÇÏëÒªµÄ£¬ÈçºÎÈöà¸ö subscriber
¹²ÏíÒ»¸ö½á¹û£¬Õâ¸öºóÃæ»áÌáµ½¡£
Variable()
Variable(value) ¿ÉÒÔ°Ñ value ±ä³ÉÒ»¸ö Observable£¬²»¹ýǰÌáÊÇʹÓÃеĸ³Öµ·½Ê½
aVariable.value = newValue£¬À´¿´¸ö Demo
let magicNumber = 42
let magicNumberVariable = Variable(magicNumber)
magicNumberVariable.asObservable().subscribe(onNext:
{
print("magic number is \($0)")
})
magicNumberVariable.value = 73
// output
//
// magic number is 42
// magic number is 73 |
Æð³õ¿´µ½Ê±£¬¾õµÃ»¹ÂùÉñÆæµÄ£¬¸ú½øÈ¥¿´ÁËÏ£¬·¢ÏÖÊÇͨ¹ý subject À´×öµÄ£¬´óÒâÊÇ°Ñ value ´æµ½Ò»¸öÄÚ²¿±äÁ¿
_value Àµ±µ÷Óà value ·½·¨Ê±£¬ÏȸüР_value Öµ£¬È»ºóµ÷ÓÃÄÚ²¿µÄ _subject.on(.next(newValue))
·½·¨¸æÖª subscriber¡£
Subject
Subject ¼òµ¥À´ËµÊÇÒ»¸ö¿ÉÒÔÖ÷¶¯·¢ÉäÊý¾ÝµÄ Observable£¬¶àÁË onNext(value),
onError(error), ¡®onCompleted¡¯ ·½·¨£¬¿ÉνȫÄÜÐÍÑ¡ÊÖ¡£
let disposeBag = DisposeBag() let subject = PublishSubject<String>() subject.addObserver("1").addDisposableTo(disposeBag) subject.onNext("??") subject.onNext("??") subject.addObserver("2").addDisposableTo(disposeBag) subject.onNext("???") subject.onNext("???") |
¼ÇµÃÔÚ RAC ʱ´ú£¬subject ÊÇÒ»¸ö²»Ì«ÍƼöʹÓõŦÄÜ£¬ÒòΪ¹ýÓÚÇ¿´óÁË£¬ÈÝÒ×ʧ¿Ø¡£RxSwift
Àïµ¹ÊÇûÓÐÌ«Ìá¼°£¬µ«»¹ÊÇÉÙÓÃΪ¼Ñ¡£
Observable -> New Observable
Observable µÄÇ¿´ó²»½öÔÚÓÚËüÄÜʵʱ¸üРvalue£¬»¹ÔÚÓÚËüÄܱ»Ð޸읹ýÂË£¯×éºÏµÈ£¬ÕâÑù¾ÍÄÜËæÐÄËùÓûµØ¹¹Ôì×Ô¼ºÏëÒªµÄÊý¾Ý£¬»¹²»Óõ£ÐÄÊý¾Ý·¢Éú±ä»¯ÁËÈ´²»ÖªµÀµÄÇé¿ö¡£
Combine
Combine ¾ÍÊǰѶà¸ö Observable ×éºÏÆðÀ´Ê¹Ó㬱ÈÈç zip (СÌáʾ£ºÈç¹û¶ÔÕâЩº¯Êý²»Ì«Ãô¸Ð£¬¿ÉÒÔʵ¼Ê²Ù×÷Ï£¬Ìå»á»á¸üÉîЩ)
zip ¶ÔÓ¦ÏÖʵÖеÄÀý×Ó¾ÍÊÇÀÁ´£¬ÀÁ´ÐèÒªÁ½¸öÔªËØÕâÑù²ÅÄÜÀÉÏÈ¥£¬ÕâÀïÒ²Ò»Ñù£¬Ö»Óе±Á½¸ö Observable
¶¼ÓÐÁËеÄֵʱ£¬subscribe ²Å»á±»´¥·¢¡£
let stringSubject = PublishSubject<String>() let intSubject = PublishSubject<Int>()
Observable.zip(stringSubject, intSubject) { stringElement,
intElement in
"\(stringElement) \(intElement)"
}
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
stringSubject.onNext("???")
stringSubject.onNext("???")
intSubject.onNext(1)
intSubject.onNext(2)
// output
//
// ??? 1
// ??? 2 |
Èç¹ûÕâÀï intSubject ʼÖÕûÓÐÖ´ÐÐ onNext£¬ÄÇô½«²»»áÓÐÊä³ö£¬¾ÍÏñÀÁ´µôÁËÒ»±ßµÄÁ´×Ó¾ÍÀ²»ÉÏÁË¡£
³ýÁË zip£¬»¹ÓÐÆäËûµÄ combine µÄ×ËÊÆ£¬±ÈÈç combineLatest / switchLatest
µÈ¡£
Transform
ÕâÊÇ×î³£¼ûµÄ²Ù×÷ÁË£¬¶ÔÒ»¸ö Observable µÄÊýÖµ×öһЩС¸Ä¶¯£¬È»ºó²ú³öеÄÖµ£¬ÒÀ¾ÉÊÇÒ»¸ö Observable¡£
let disposeBag = DisposeBag() Observable.of(1, 2, 3) .map { $0 * $0 } .subscribe(onNext: { print($0) }) .addDisposableTo(disposeBag) |
ÕâÊÇ´óÖµÄʵÏÖ£¨Õª×Ô¹ÙÍø£©
extension ObservableType { func myMap<R>(transform: E -> R) -> Observable<R> { return Observable.create { observer in let subscription = self.subscribe { e in switch e { case .next(let value): let result = transform(value) observer.on(.next(result)) case .error(let error): observer.on(.error(error)) case .completed: observer.on(.completed) } }
return subscription
}
}
} |
½ÓÊÜÒ»¸ö transform ±Õ°ü£¬È»ºó·µ»ØÒ»¸ö Observable£¬ÒòΪ½ÓÏÂÀ´Ê¹ÓÃÕß½«»á¶Ô myMap
µÄ½á¹û½øÐÐ subscribe£¬ËùÒÔÐèÒªÔÚ create ÄÚ²¿ subscribe һϣ¬²»È»×ʼµÄÄǸö
Observable ¾ÍÊǸö Cold Observable£¬Ò»¸ö Cold Observable ÊDz»»á²úÉúеÄÊý¾ÝµÄ¡£
Filter
Filter µÄ×÷ÓÃÊÇ¶Ô Observable ´«¹ýÀ´µÄÊý¾Ý½øÐйýÂË£¬Ö»ÓзûºÏÌõ¼þµÄ²ÅÓÐ×ʸñ±» subscribe¡£Ð´·¨Éϸú
map ²î²»¶à£¬¾Í²»×¸ÊöÁË¡£
Connect
ÕâÊÇͦÓÐÒâ˼µÄÒ»¿é£¬ÔÚ֮ǰ½éÉÜ Observable.create ʱÓÐÌáµ½¹ý£¬Ò»¸ö Observable
±»¶à´Î subscribe ¾Í»á±»¶à´Î´¥·¢£¬Èç¹ûÒ»¸öÍøÂçÇëÇóÖ»Ïë±»´¥·¢Ò»´Î£¬Í¬Ê±Ö§³Ö¶à¸ö subscriber£¬¾Í¿ÉÒÔʹÓÃ
publish + connect µÄ×éºÏ¡£
µ±Ò»¸ö Observable ʹÓÃÁË publish() ·½·¨ºó£¬Õý³£µÄ subscribe ¾Í²»»á´¥·¢ËüÁË£¬³ý·Ç
connect() ·½·¨±»µ÷Ó᣶øÇÒÿ´Î subscribe ²»»áµ¼Ö Observable ÖØÐÂÕë¶Ô
observer ´¦ÀíÒ»±é¡£¿´Ò»ÏÂÕâÕÅͼ

ÓÐÁ½¿éÐèҪעÒ⣺
connect() ֮ǰµÄÁ½´Î subscribe ²¢Ã»ÓвúÉúÐ嵀 value¡£
connect() Ö®ºó subscribe µÄ£¬Ö»ÊǵȴýÐ嵀 value£¬Í¬Ê±Ð嵀 value »¹»á·Ö·¢¸øÖ®Ç°µÄ
subscriber¡£
¼´Ê¹ËùÓÐµÄ subscription ±» dispose, Observable ÒÀ¾É´¦ÓÚ hot ״̬£¬¾ÍºÃÏñ»¹ÒÔΪÓÐÈ˹ØÐÄеÄÖµÒ»Ñù¡££¨Õâ¿ÉÄܲ»ÊÇÏëÒªµÄ½á¹û£©
Õë¶ÔµÚ 3 µã£¬¿ÉÒÔʹÓà refcount() À´´úÌæ connect()£¬Ç°Õß»áÔÚûÓÐ subscriber
ʱ×Ô¶¯¡¸À䡹ÏÂÀ´£¬²»»áÔÙ²úÉúеÄÖµ¡££¨Demo È¡×ÔÕâÀ
let
myObservable = Observable<Int>.interval(1,
scheduler: MainScheduler.instance).publish().refCount()
// 1)
let mySubscription = myObservable.subscribe(onNext:
{
print("Next: \($0)")
})
delay(3) {
print("Disposing at 3 seconds")
mySubscription.dispose()
}
delay(6) {
print("Subscribing again at 6 seconds")
myObservable.subscribe(onNext: {
print("Next: \($0)")
})
}
delay(6) {
print("Subscribing again at 6 seconds")
myObservable.subscribe(onNext: {
print("Next: \($0)")
})
} |
Êä³ö
Starting at 0 seconds Next: 0 Next: 1 Next: 2 Disposing at 3 seconds Subscribing again at 6 seconds Next: 0 Next: 1 |
¿ÉÒÔ¿´µ½£¬3 Ãëºó subscription dispose£¬´ËʱûÓÐÈκΠsubscriber »¹¹ØÐÄ
Observable£¬Òò´Ë¾ÍÖØÖÃÁË£¬ËùÒÔ 6 ÃëºóÓֻص½Á˳õʼ״̬£¨Èç¹û±ä³É connect ·½·¨µÄ»°£¬»á·¢ÏÖ
6 Ãëºó»áÊä³ö Next: 6 / Next: 7£©
ÄÇÈç¹ûºó¼ÓÈëµÄ subscriber ÏëҪ֮ǰµÄÊý¾ÝÔõô°ì£¿¿ÉÒÔ¶ÔÔʼµÄ Observable ÉèÖÃ
replay(n)£¬±íʾ×î¶à·µ»Ø n ¸öÔªËØ¸øºó¼ÓÈëµÄ subscriber¡£
Tips
ÉÏÃæ½éÉܵÄÊÇ×î»ù±¾µÄ¸ÅÄ˳±ãÌáһϱȽϳ£¼ûµÄ¼¸¸öÎÊÌ⣺
ÈçºÎ´¦Àí Scheduler£¿
ĬÈÏ´úÂë¶¼ÊÇÔÚµ±Ç°Ïß³ÌÖÐÖ´Ðеģ¬Èç¹ûÒªÊÖ¶¯Çл»Ị̈߳¬¿ÉÒÔʹÓà subsribeOn ºÍ observeOn
Á½ÖÖ·½Ê½£¬Ò»°ãÀ´ËµºóÕßÓõûá¶àһЩ£¬ÄÇÕâÁ½ÕßÓÐÊ²Ã´Çø±ðÄØ£¿
subscribeOn ¸úλÖÃÎ޹أ¬Ò²¾ÍÊÇÎÞÂÛÔÚÁ´Ê½µ÷ÓõÄʲôµØ·½£¬Observable ºÍ subscription
¶¼»áÊÜÓ°Ï죻¶ø observeOn Ôò½ö¶ÔÖ®ºóµÄµ÷ÓòúÉúÓ°Ï죬¿´¸ö Demo£º
var observable = Observable<Int>.create { (observer: AnyObserver<Int>) -> Disposable in print("observable thread: \(Thread.current)") observer.onNext(1) observer.onCompleted() return Disposables.create() }
let disposeBag = DisposeBag()
observable
.map({ (e) -> Int in
print("map1 thread: \(Thread.current)")
return e + 1
})
.observeOn(ConcurrentDispatchQueueScheduler(qos:
.userInteractive)) // 1
.map({ (e) -> Int in
print("map2 thread: \(Thread.current)")
return e + 2
})
.subscribe(onNext:{ (e) -> Void in
print("subscribe thread: \(Thread.current)")
})
.addDisposableTo(disposeBag) |
Èç¹û 1) ÊÇ observeOn£¬ÄÇôÊä³öÈçÏÂ
observable thread: <NSThread: 0x7f901cc0d510>{number = 1, name = main} map1 thread: <NSThread: 0x7f901cc0d510>{number = 1, name = main} map2 thread: <NSThread: 0x7f901ce15560>{number = 3, name = (null)} subscribe thread: <NSThread: 0x7f901ce15560>{number = 3, name = (null)}
|
¿ÉÒÔ¿´µ½ observable thread ºÍ map1 thread ÒÀ¾É±£³Öµ±Ç°Ị̈߳¬µ« observeOn
Ö®ºó¾Í±ä³ÉÁËÁíÒ»¸öÏ̡߳£
Èç¹û 1) ÊÇ subscribeOn£¬ÄÇô»áÊä³ö
observable thread: <NSThread: 0x7fbdf1e097a0>{number = 3, name = (null)} map1 thread: <NSThread: 0x7fbdf1e097a0>{number = 3, name = (null)} map2 thread: <NSThread: 0x7fbdf1e097a0>{number = 3, name = (null)} subscribe thread: <NSThread: 0x7fbdf1e097a0>{number = 3, name = (null)} |
¿ÉÒÔ¿´µ½È«¶¼±ä³ÉÁË subscribeOn Ö¸¶¨µÄ Queue¡£ËùÒÔ subscribeOn µÄ¸ÐȾÁ¦ºÜÇ¿£¬Á¬
Observable ¶¼ÄÜÓ°Ïìµ½¡£
Cold Observable ºÍ Hot Observable
Cold Ï൱ÓÚ InActive£¬¾ÍÏñÎ÷²¿ÊÀ½çÀδ±»¼¤»îµÄ»úÆ÷ÈËÒ»Ñù£»Hot ¾ÍÊÇ´¦ÓÚ¹¤×÷״̬µÄ»úÆ÷ÈË¡£
Subscription ΪʲôҪ Dispose£¿
ÒòΪÓÐÁË Subscriber ËùÒÔ Observable ±»¼¤»î£¬È»ºóÄÚ²¿¾Í»áʹÓø÷ÖÖ±äÁ¿À´±£´æ×ÊÔ´£¬Èç¹û²»
dispose µÄ»°£¬ÕâЩ×ÊÔ´¾Í»áÒ»Ö±±» keep£¬ºÜÈÝÒ×Ôì³ÉÄÚ´æÐ¹Â©¡£
ͬʱÊÖ¶¯ dispose ÓÖÏÓÂé·³£¬ËùÒÔ¾ÍÓÐÁË DisposeBag£¬µ±Õâ¸ö Bag ±»»ØÊÕʱ£¬Bag
ÀïÃæµÄ subscription »á×Ô¶¯±» dispose£¬Ï൱ÓÚ´Ó MRC ±ä³ÉÁË ARC¡£
С½á
RxSwift Èç¹û¸ÅÄîÉÏÕûÀíÇå³þÁË£¬»á·¢ÏÖÆäʵ²¢²»ÄÑ£¬¶à´Ó Observable µÄ½Ç¶Èȥ˼¿¼ÎÊÌ⣬¶àÏë×Åת»»ºÍ×éºÏ£¬ÂýÂý¾Í»á´ÓÃüÁîʽ±à³Ìתµ½ÉùÃ÷ʽ±à³Ì£¬¶ÔÓÚ³éÏóÄÜÁ¦ºÍ´úÂëµÄ¿É¶ÁÐÔ¶¼»áÓÐÌáÉý¡£
|