RxSwift 深入淺出(八)開發(fā)總結(jié)

RxSwift 這個(gè)框架看我就夠了之宿,這一篇我重點(diǎn)介紹RxSwift在開發(fā)中的總結(jié)族操,數(shù)據(jù)請(qǐng)求,數(shù)據(jù)格式轉(zhuǎn)換比被,數(shù)據(jù)聯(lián)動(dòng)色难,數(shù)據(jù)綁定。搞RxSwift姐赡,我是認(rèn)真的

RxSwift 寶圖鎮(zhèn)博,咔咔點(diǎn)贊~~~~

Rxswift
import Foundation
import RxSwift
import RxCocoa

struct Repository {
    let name: String
    let url: String
}


class RxNewSearchViewModel {
    
    let searchText = Variable("")
    
    lazy var searData:Driver<[Repository]> = {
        return self.searchText.asObservable()
            .throttle(0.5, scheduler: MainScheduler.instance)//不能一直回調(diào),隔0.5秒
            .distinctUntilChanged()//防重復(fù)
            .flatMapLatest(RxNewSearchViewModel.RepositoiesFor)
            .asDriver(onErrorJustReturn: [])
    }()
    
    static func RepositoiesFor(_ githubId:String)->Observable<[Repository]> {
        
        //防空,防非Url
        guard !githubId.isEmpty, let url = URL(string: "https://api.github.com/users/\(githubId)/repos") else {
            return Observable.just([])
        }
        
        return URLSession.shared.rx.json(url: url)
            .retry(3)
            .observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
            .map(parse)
    }
    
    static func parse(json:Any) -> [Repository]{
        guard let items = json as? [[String:Any]] else { return [] }
        var repose = [Repository]()
        items.forEach { (item) in
            guard let name = item["name"] as? String,
                let url = item["html_url"] as? String else {return}
            
            repose.insert(Repository(name: name, url: url), at: 0)
        }
        return repose
    }
    
}
  • 這里是數(shù)據(jù)請(qǐng)求利用的是:URLSession.shared.rx.json莱预,
  • 數(shù)據(jù)格式轉(zhuǎn)換,序列化 轉(zhuǎn)成我們需要的常規(guī)模型:Repository
  • 數(shù)據(jù)聯(lián)動(dòng),通過綁定一個(gè)序列项滑,牽連外面的搜索內(nèi)容
import UIKit
import RxSwift
import RxCocoa
import RxDataSources


class RxNewSearchVc: UIViewController {
    
    //通過參數(shù)searchResultsController傳nil來初始化UISearchController依沮,意思是我們告訴search controller我們會(huì)用相同的視圖控制器來展示我們的搜索結(jié)果,如果我們想要指定一個(gè)不同的view controller枪狂,那就會(huì)被替代為顯示搜索結(jié)果危喉。
    let searchController = UISearchController(searchResultsController: nil)
    var searchBar: UISearchBar{return searchController.searchBar}
    var myTableView:UITableView!
    let reuserId = "cell"
    let disposeB = DisposeBag()
    let viewModel = RxNewSearchViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "RxNetworkSearch";
        self.view.backgroundColor = UIColor.white
        self.myTableView = UITableView(frame: self.view.bounds, style: UITableViewStyle.plain)
        self.view.addSubview(self.myTableView)
        self.myTableView.register(SectionTableCell.self, forCellReuseIdentifier: reuserId)

        searchController.obscuresBackgroundDuringPresentation = false
        searchBar.showsCancelButton = true
        searchBar.placeholder = "請(qǐng)輸出你要搜索的內(nèi)容"
        myTableView.tableHeaderView = searchController.searchBar
        //只要在要實(shí)現(xiàn)搜索功能的控制器里設(shè)置:self.definesPresentationContext = YES;即可實(shí)現(xiàn)UISearchController的UISearchBar跟隨self.view一起滑動(dòng)。
        definesPresentationContext = true
        
        
        viewModel.searData
            .drive(myTableView.rx.items){ (tb, row, model) -> UITableViewCell in
                let cell = tb.dequeueReusableCell(withIdentifier: self.reuserId) as? SectionTableCell
                cell?.textLabel?.text = model.name
                cell?.detailTextLabel?.text = model.url
                return cell!
            }
            .disposed(by:disposeB)
        
        searchBar.rx.text.orEmpty
            .bind(to: viewModel.searchText)
            .disposed(by: disposeB)
        
        
        viewModel.searData.asDriver()
            .map { (repose) -> String in
                return "\(repose.count)個(gè) 搜索結(jié)果"
        }
            .drive(navigationItem.rx.title)
            .disposed(by: disposeB)
        
        
        myTableView.rx.didEndDecelerating
            .subscribe(onNext: { [weak self]() in
                self?.searchBar.endEditing(true)
            })
            .disposed(by: disposeB)
        
    }
}

  • 數(shù)據(jù)綁定我們的searchBar
  • 數(shù)據(jù)綁定到myTableView

RxSwift是一個(gè)非常nice的框架州疾,給了我們很多的封裝辜限,流程簡(jiǎn)化,代碼精簡(jiǎn)严蓖。但是有一個(gè)BUG:就是會(huì)上癮薄嫡。還有學(xué)習(xí)成本還是有一定難度的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颗胡,一起剝皮案震驚了整個(gè)濱河市毫深,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毒姨,老刑警劉巖哑蔫,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闸迷,警方通過查閱死者的電腦和手機(jī)嵌纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腥沽,“玉大人逮走,你說我怎么就攤上這事〗裱簦” “怎么了言沐?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)酣栈。 經(jīng)常有香客問我险胰,道長(zhǎng),這世上最難降的妖魔是什么矿筝? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任起便,我火速辦了婚禮,結(jié)果婚禮上窖维,老公的妹妹穿的比我還像新娘榆综。我一直安慰自己,他們只是感情好铸史,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布鼻疮。 她就那樣靜靜地躺著,像睡著了一般琳轿。 火紅的嫁衣襯著肌膚如雪判沟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天崭篡,我揣著相機(jī)與錄音挪哄,去河邊找鬼。 笑死琉闪,一個(gè)胖子當(dāng)著我的面吹牛迹炼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颠毙,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斯入,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛀蜜?” 一聲冷哼從身側(cè)響起刻两,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涵防,沒想到半個(gè)月后闹伪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壮池,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年偏瓤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椰憋。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厅克,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出橙依,到底是詐尸還是另有隱情证舟,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布窗骑,位于F島的核電站女责,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏创译。R本人自食惡果不足惜抵知,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望软族。 院中可真熱鬧刷喜,春花似錦、人聲如沸立砸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颗祝。三九已至浊闪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間螺戳,已是汗流浹背规揪。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留温峭,地道東北人猛铅。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凤藏,于是被迫代替她去往敵國(guó)和親奸忽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容