Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÊÇʱºòѧϰ RxSwift ÁË
 
 À´Ô´£ºlimboy.me ·¢²¼ÓÚ£º2017-1-9
  1912  次浏览      28
 

ÏàÐÅÔÚ¹ýÈ¥µÄÒ»¶Îʱ¼äÀ¶Ô 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 µÄ½Ç¶Èȥ˼¿¼ÎÊÌ⣬¶àÏë×Åת»»ºÍ×éºÏ£¬ÂýÂý¾Í»á´ÓÃüÁîʽ±à³Ìתµ½ÉùÃ÷ʽ±à³Ì£¬¶ÔÓÚ³éÏóÄÜÁ¦ºÍ´úÂëµÄ¿É¶ÁÐÔ¶¼»áÓÐÌáÉý¡£

 

   
1912 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ