Promise
Pipeline
Master-Slave
Serial Thread Confinement
Promise
:
所謂
Promise
, 就是一個(gè)對(duì)象, 用來(lái)傳遞異步操作的消息. 它代表了某個(gè)未來(lái)才會(huì)知道結(jié)果的事件(通常是一個(gè)異步操作), 并且這個(gè)事件提供統(tǒng)一的API
, 可供進(jìn)一步處理.
對(duì)象的狀態(tài)不受外界影響.
Promise
對(duì)象代表一個(gè)異步操作, 有三種狀態(tài):
Pending
(進(jìn)行中)又稱Incomplete
Resolved
(已完成)又稱Fulfilled
Rejected
(已失敗)
只有異步操作的結(jié)果, 可以決定當(dāng)前是哪一種狀態(tài), 任何其他操作都無(wú)法改變這個(gè)狀態(tài). 這也是Promise
這個(gè)名字的由來(lái), 他的英語(yǔ)意思就是承諾, 表示其他手段無(wú)法改變.
一旦狀態(tài)改變, 就不會(huì)再變, 任何時(shí)候都可以得到這個(gè)結(jié)果.
Promise
對(duì)象的狀態(tài)改變, 只有兩種可能:
從Pending
變?yōu)?code>Resolved和從Pending
變?yōu)?code>Rejected.
只要這兩種情況發(fā)生, 狀態(tài)就凝固了, 不會(huì)再變了, 會(huì)一直保持這個(gè)結(jié)果.就算改變已經(jīng)發(fā)生了, 你再對(duì)Promise
對(duì)象添加回調(diào)函數(shù), 也會(huì)立即得到這個(gè)結(jié)果. 這與事件(Event
)完全不同, 事件的特點(diǎn)是, 如果你錯(cuò)過(guò)了它, 再去監(jiān)聽(tīng), 是得不到結(jié)果的.
案例
: 兩個(gè)操作先后依賴, 第二個(gè)網(wǎng)絡(luò)請(qǐng)求需要第一個(gè)網(wǎng)絡(luò)請(qǐng)求的返回值currentUser
作為參數(shù)
APIClient.fetchCurrentUser(success: { currentUser in
APIClinet.fetchFollowers(user: currentUser, success: { followers in
// 得到一個(gè)flowwers 數(shù)組
}, failure: { error in
// 錯(cuò)誤處理
})
}, failure: { error in
// 錯(cuò)誤處理
})
弊端
:
- 在需要多個(gè)操作的時(shí)候, 會(huì)導(dǎo)致多個(gè)回調(diào)函數(shù)嵌套, 導(dǎo)致代碼不夠直觀, 就是常說(shuō)的
Callback Hell
- 如果幾個(gè)異步操作之間并沒(méi)有前后順序之分(例如不需要前一個(gè)請(qǐng)求的結(jié)果作為后一個(gè)請(qǐng)求的參數(shù))時(shí), 同樣需要等待上一個(gè)操作完成再實(shí)行下一個(gè)操作.
- 喪失了
return
特性.
使用Promise
優(yōu)化后:
APIClient.fetchCurrentUser()
.then({ currentUser in
return APIClient.fetchFollowers(user: currentUser)
})
.then({ followers in
// you now have an array of followers
})
.onFailure({ error in
// hooray, a single failure block!
})
自己在OC中沒(méi)有這種使用經(jīng)歷, 在RN開(kāi)發(fā)中有使用過(guò), 的確很好的解決了回調(diào)地獄的問(wèn)題
Pipeline
:
將一個(gè)任務(wù)分解為若干個(gè)階段(
Stage
), 前階段的輸出為下階段的輸入, 各個(gè)階段由不同的工作者線程負(fù)責(zé)執(zhí)行.
各個(gè)任務(wù)的各個(gè)階段是并行(Parallel
)處理的
具體任務(wù)的處理是串行的, 即完成一個(gè)任務(wù)要依次執(zhí)行各個(gè)階段, 但從整體任務(wù)上看, 不同任務(wù)的各個(gè)階段的執(zhí)行時(shí)并行的.
Pipeline
Master-Slave
:
將一個(gè)任務(wù)分解為若干個(gè)語(yǔ)義等同的子任務(wù), 并由專門的工作者線程來(lái)并行執(zhí)行這些子任務(wù), 既提高計(jì)算效率, 又實(shí)現(xiàn)了信息隱藏.
Master-Slave
Serial Thread Confinement
:
如果并發(fā)任務(wù)的執(zhí)行涉及某個(gè)非線程安全對(duì)象, 而很多時(shí)候我們又不希望因此而引入鎖.
通過(guò)將多個(gè)并發(fā)的任務(wù)存入隊(duì)列實(shí)現(xiàn)任務(wù)的串行化, 并未這些串行化任務(wù)創(chuàng)建唯一的工作者線程進(jìn)行處理.