ReactiveCocoa中l(wèi)ift的使用方法

我對(duì)這個(gè)方法的理解是:轉(zhuǎn)化現(xiàn)有的信號(hào)為我們需要的新的信號(hào)喊式,并且在信號(hào)發(fā)出start()信號(hào)時(shí)才啟動(dòng)

先來(lái)看個(gè)簡(jiǎn)單的栗子吧:

    /**
     由給定的信號(hào)操作符創(chuàng)建一個(gè)新的信號(hào)
     */
    func liftExample() {
       let transform: Signal<Int, NoError> -> Signal<String, NoError> = {
            signal in
            return signal.map { "I have get \($0)" }
        }
        SignalProducer<Int, NoError>(value: 100)
//        .lift(transform)
            .startWithNext { print($0) }
    }

這里如果我們不加lift的話打印出來(lái)的是100鞭缭,但是把lift加上的話,打印出來(lái)的是I have get 100

來(lái)看看lift方法中調(diào)用的transform里到底什么意思:把原有的<Int, NoError>類型的信號(hào)轉(zhuǎn)換成<String, NoError>類型的信號(hào)---
return signal.map { "I have get ($0)" }的意思是原有的信號(hào)經(jīng)過(guò)map轉(zhuǎn)變成string字符串類型头岔,并發(fā)送.

下面在寫(xiě)個(gè)例子--我把它步驟分解下肄满”倏剑看其怎么一步一步實(shí)現(xiàn)的

//創(chuàng)建轉(zhuǎn)換的類型--- Signal<[Int], NoError> -> Signal<[Int], NoError> 
let transform: Signal<[Int], NoError> -> Signal<[Int], NoError> = {
      //原來(lái)的信號(hào)
            originalSignal in
         //創(chuàng)建新的信號(hào)
            let (resultSignal, resultObserver) = Signal<[Int], NoError>.pipe()
        //原來(lái)的信號(hào)發(fā)送信號(hào)
            originalSignal.observeNext({ originalArr in
        //把原有信號(hào)中的數(shù)組中每個(gè)元素做  乘 5 再加 2 的操作,并返回一個(gè)接受此結(jié)果的新數(shù)組
                let newArr = originalArr.map { $0 * 5 + 2 }
         //新信號(hào)的觀察者發(fā)送信號(hào)-----最重要一定要新信號(hào)的觀察者發(fā)送信號(hào)掏缎,外界才能做出反應(yīng)
                resultObserver.sendNext(newArr)
            })
       // 返回新的信號(hào)
            return resultSignal
        }
        
        SignalProducer<[Int], NoError>(value: [1, 2, 3, 4, 5])
        .lift(transform)
        .startWithNext { result in
            print(result)
        }

打印出的結(jié)果為 [7, 12, 17, 22, 27]

下面再舉個(gè)我項(xiàng)目中有點(diǎn)麻煩的一個(gè)例子---

項(xiàng)目中需要獲取城市列表皱蹦,但是后臺(tái)給的是兩段式獲取的。眷蜈。即先獲取獲取全部的省沪哺,然后在根據(jù)省ID來(lái)獲取下面的市。但是我想要是的一個(gè)數(shù)組類型---[“省名稱”: [市]]酌儒。下面直接放代碼

typealias CityDic = [String: [City]]
   let cityDic = MutableProperty<CityDic>(CityDic())

/**
     獲取城市列表
     */
    mutating private func getCityList() {
        let transform: Signal<[City], NetRequestError> -> Signal<CityDic, NetRequestError> = {
            citysSignal in
            let (resultSignal, resultObserver) = Signal<CityDic, NetRequestError>.pipe()
            citysSignal.observe({ event in
                switch event {
                case let .Next(provinces):
      //這里獲取到的是全部的省--需要再進(jìn)一步獲取到全部的市

                  //在這里一定要?jiǎng)?chuàng)建GCD  group辜妓,因?yàn)榫W(wǎng)絡(luò)請(qǐng)求是異步的,如果不加入group的話忌怎,它會(huì)先直接返回結(jié)果籍滴,然后在請(qǐng)求網(wǎng)絡(luò)
                    let group = dispatch_group_create()
                    var dict = CityDic()
                provinces.forEach({ (province) in
             //這里一定要在循環(huán)里面dispatch_group_enter,不能放在外面---因?yàn)橐粋€(gè)循環(huán)就是一個(gè)網(wǎng)絡(luò)請(qǐng)求
                    dispatch_group_enter(group)
                 NetHelper.sharedInstance.requestProvider
                 .request(RequestAPI.getCityList(type: CityType.city, parentId: province.id))
                 .mapResponseToObjArray(City)
                 .start({ event in
                    switch event {
                     case let .Next(value):
                        dict.updateValue(value, forKey: province.name!)
                        dispatch_group_leave(group)
                     case  let .Failed(error):
                   //這里榴啸,無(wú)論是失敗還是成功孽惰,或者是其他什么。請(qǐng)立即退出group  ----dispatch_group_leave(group)
                        resultObserver.sendFailed(error)
                        dispatch_group_leave(group)
                     default:
                        dispatch_group_leave(group)
                        return
                        }
                      })
                    })
                    dispatch_group_notify(group, dispatch_get_main_queue(), {
                     //然后鸥印,在GCD group收到結(jié)束通知的時(shí)候勋功,在主線程里觀察者發(fā)送結(jié)果
                        resultObserver.sendNext(dict)
                    })
                default:
                    break
                }
            })
            return resultSignal
        }
        NetHelper.sharedInstance.requestProvider
        .request(RequestAPI.getCityList(type: CityType.province, parentId: nil))
        .mapResponseToObjArray(City)
        .lift(transform)
        .startWithResult { result in
            switch result {
            case let .Success(value):
                self.cityDic.value = value
            case let .Failure(error):
                print(error)
            }
        }
    }

注:這里面用到了我之前寫(xiě)道的 一篇文章里的內(nèi)容坦报, 使用Moya+ReactiveCocoa 進(jìn)行網(wǎng)絡(luò)請(qǐng)求,那篇文章里面也用到了lift狂鞋,大家有興趣的話片择,可以去看看http://www.reibang.com/p/7bf635577900

這里面最主要的是要用GCD group~~而且是dispatch_group_enter(group) 以及dispatch_group_leave(group),不能用dispatch_group_async(dispatchGroup, dispatchQueue, ^(){ NSLog(@"dispatch-1"); });骚揍,因?yàn)樽止埽W(wǎng)絡(luò)請(qǐng)求是一個(gè)操作,但是網(wǎng)絡(luò)請(qǐng)求返回結(jié)果又是一個(gè)操作----切記切記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末信不,一起剝皮案震驚了整個(gè)濱河市嘲叔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浑塞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件政己,死亡現(xiàn)場(chǎng)離奇詭異酌壕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)歇由,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)卵牍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人沦泌,你說(shuō)我怎么就攤上這事糊昙。” “怎么了谢谦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵释牺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我回挽,道長(zhǎng)没咙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任千劈,我火速辦了婚禮祭刚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘墙牌。我一直安慰自己涡驮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布喜滨。 她就那樣靜靜地躺著捉捅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虽风。 梳的紋絲不亂的頭發(fā)上锯梁,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天即碗,我揣著相機(jī)與錄音,去河邊找鬼陌凳。 笑死剥懒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的合敦。 我是一名探鬼主播初橘,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼充岛!你這毒婦竟也來(lái)了保檐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤崔梗,失蹤者是張志新(化名)和其女友劉穎夜只,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蒜魄,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扔亥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谈为。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旅挤。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伞鲫,靈堂內(nèi)的尸體忽然破棺而出粘茄,到底是詐尸還是另有隱情,我是刑警寧澤秕脓,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布柒瓣,位于F島的核電站,受9級(jí)特大地震影響吠架,放射性物質(zhì)發(fā)生泄漏嘹朗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一诵肛、第九天 我趴在偏房一處隱蔽的房頂上張望屹培。 院中可真熱鬧,春花似錦怔檩、人聲如沸褪秀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)媒吗。三九已至,卻和暖如春乙埃,著一層夾襖步出監(jiān)牢的瞬間闸英,已是汗流浹背锯岖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甫何,地道東北人出吹。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辙喂,于是被迫代替她去往敵國(guó)和親捶牢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理巍耗,服務(wù)發(fā)現(xiàn)秋麸,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • 在上一篇文章中炬太,我們對(duì)GCD有了基本的認(rèn)知灸蟆,知道其中一些簡(jiǎn)單的類型,和一些簡(jiǎn)單函數(shù)亲族。這本篇文章中炒考,我們將繼續(xù)學(xué)習(xí)G...
    凌云壯志幾多愁閱讀 1,184評(píng)論 0 0
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,310評(píng)論 0 6
  • 方法一: beginAnimations方法孽水,此方法中包含有很多 setAnimation方法票腰,具體代碼可以進(jìn)入該...
    南波萬(wàn)_閱讀 411評(píng)論 0 0
  • 2017.2.1 作為一名合格的吃貨的我城看,當(dāng)然不肯放過(guò)每一次分享美食的機(jī)會(huì)了女气。 吃過(guò)那么多美食,我最喜愛(ài)的...
    千柚閱讀 243評(píng)論 2 1