記錄swift新語法,task,async-await

因?yàn)樽罱?jīng)常遇到許多網(wǎng)絡(luò)請(qǐng)求,需要滿足一個(gè)條件,之后才能繼續(xù)請(qǐng)求
在此舉例:
{
登錄中使用token
這個(gè)token,要作為后續(xù)某些網(wǎng)絡(luò)請(qǐng)求的關(guān)鍵,而token也存在過期的問題,所以請(qǐng)求接口返回過期后,要重新請(qǐng)求token,再執(zhí)行網(wǎng)絡(luò)請(qǐng)求
!:傳統(tǒng)寫法

//1:GCD信號(hào)量控制
typealias NETBLock = ((Bool)->Void)
    var semaphore = DispatchSemaphore(value: 1)
    func textNET(){
        text(id: 1)
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
            self.text(id: 2)
        }
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            self.text(id: 3)
        }
    }
    func text(id:Int){
        DispatchQueue.global().async {[weak self] in
            print("??[包含用戶iD請(qǐng)求],開始請(qǐng)求,id\(id)")
            self?.semaphore.wait()
            print("??[包含用戶iD請(qǐng)求],等待執(zhí)行,id\(id)")

            self?.regsiter { isRegsin in
                self?.semaphore.signal()
                print("??[包含用戶iD請(qǐng)求],結(jié)束等待,id\(id)")

                if isRegsin{
                    self?.load(block: { isSccuess in
                        if !isSccuess{
                            self?.semaphore.wait()
                            self?.login(block: { login in
                                self?.semaphore.signal()
                                if login{
                                    self?.text(id: id)
                                }
                            })
                        }
                    })
                }
            }
            

        }
    }
    func regsiter(block:@escaping NETBLock){
        if isRegin{
            block(true)
            return
        }
        Thread.sleep(forTimeInterval: Double.random(in: 1..<5))
        block(true)
        isRegin = true
    }
    func load(block:@escaping NETBLock){
        Thread.sleep(forTimeInterval: Double.random(in: 1..<5))
        block(Bool.random())
    }
    func login(block:@escaping NETBLock){
        Thread.sleep(forTimeInterval: Double.random(in: 1..<5))
        block(true)
    }
//2:Operation
//用的不多,忽略了

}
上面的GCD寫法可以說是傳統(tǒng)寫法了.我這里要先注冊(cè),再執(zhí)行下一步,但是預(yù)防并發(fā)注冊(cè),所以這種寫法,有更優(yōu)化方法歡迎提出
接下來說到新語法

enum NetError : Error {
        case netfail
    }
    func login() async throws -> Bool {
        let isNet = Bool.random()
        if isNet {
            // 模擬網(wǎng)絡(luò)延遲
            try await Task.sleep(nanoseconds: UInt64.random(in: 1_000_000_000..<5_000_000_000))
            return true
        } else {
            // 拋出網(wǎng)絡(luò)錯(cuò)誤
            throw NetError.netfail
        }
    }
    func regsin()async ->Bool{
        // 模擬網(wǎng)絡(luò)延遲
        do{
            try await Task.sleep(nanoseconds: UInt64.random(in: 1_000_000_000..<5_000_000_000))
            return true
        }catch{
            return false
        }
    }
    func loadApi()async->Bool{
        // 模擬網(wǎng)絡(luò)延遲
        do{
            try await Task.sleep(nanoseconds: UInt64.random(in: 1_000_000_000..<5_000_000_000))
            return true
        }catch{
            return false
        }
    }
    func load(){
        Task {
            let isRegin = await regsin()
            //注冊(cè)成功
            if isRegin{
                let apiResult = await loadApi()
                //如果api請(qǐng)求失敗
                if !apiResult{
                    //重新調(diào)用登錄接口,調(diào)用成功后,重新請(qǐng)求
                    if let loginResult = try? await login(){
                        load()
                    }
                }
            }
        }
    }

用Task可以處理某些必須串行隊(duì)列,和多個(gè)異步block嵌套的問題,更加簡(jiǎn)介
這里介紹異步block 和 async 搭配用法

func asyncBlock(block:@escaping ((Bool)->Void)){
        Thread.sleep(forTimeInterval: Double.random(in: 1..<5))
        block(true)
    }
    func loadData()async -> Bool{
        return await withCheckedContinuation { continuation in
            asyncBlock { result in
                continuation.resume(returning: result)
            }
        }
    }
//返回當(dāng)前線程
  func getData()->Task<Void, Error>{
        let task = Task {
//檢查當(dāng)前線程是否被取消
            try Task.checkCancellation()
            let result = await loadData()
        }
        return task
    }
//取消線程示例
    func cancelGetData(){
        let task = getData()
//取消線程
        task.cancel()
    }
//對(duì)于這個(gè)語法我更喜歡的一點(diǎn)是,一個(gè)數(shù)組需要遍歷,進(jìn)行異步操作
///假設(shè)我需要用當(dāng)前index 和 index - 1 的數(shù)據(jù)進(jìn)行異步數(shù)據(jù)比對(duì),最后遍歷完成將所有數(shù)據(jù)匯總
傳統(tǒng)方法:只有用信號(hào)量加線程組的方式,較難把控邏輯是否完整,和并發(fā)數(shù)量整體控制
如果用task 可以更加清晰的完成這個(gè)邏輯

上述的方法包含我對(duì)task 和 async,await 理解. 在swiftUI中新的異步語法會(huì)更加附和語言特性.如有不足或者錯(cuò)誤,請(qǐng)及時(shí)幫我指出.謝謝閱讀到此處

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末飘千,一起剝皮案震驚了整個(gè)濱河市栈雳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霉旗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厌秒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鸵闪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門辟灰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來篡石,“玉大人芥喇,你說我怎么就攤上這事凰萨。” “怎么了胖眷?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵瘦材,是天一觀的道長(zhǎng)厅须。 經(jīng)常有香客問我食棕,道長(zhǎng),這世上最難降的妖魔是什么簿晓? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮忆植,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朝刊。我一直安慰自己蜈缤,他們只是感情好拾氓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布咙鞍。 她就那樣靜靜地躺著房官,像睡著了一般续滋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疲酌,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音事示,去河邊找鬼僻肖。 笑死肖爵,一個(gè)胖子當(dāng)著我的面吹牛臀脏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揉稚,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼余境!你這毒婦竟也來了灌诅?” 一聲冷哼從身側(cè)響起芳来,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤即舌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顽聂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡紊搪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年全景,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚪燕。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馆纳,死狀恐怖诗良,靈堂內(nèi)的尸體忽然破棺而出鲁驶,到底是詐尸還是另有隱情,我是刑警寧澤钥弯,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站总处,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鹦马。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一荸频、第九天 我趴在偏房一處隱蔽的房頂上張望客冈。 院中可真熱鬧,春花似錦场仲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褐健。三九已至,卻和暖如春蚜迅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谁不。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刹帕,地道東北人谎替。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓蹋辅,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親侦另。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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