第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在SWIFT中使用調(diào)度單例模型

在SWIFT中使用調(diào)度單例模型

森林海 2019-06-03 16:17:22
在SWIFT中使用調(diào)度單例模型我正試圖為SWIFT中的使用找出一個(gè)合適的單例模型。到目前為止,我已經(jīng)能夠得到一個(gè)非線程安全模型,其作用是:class var sharedInstance:TPScopeManager {     get {         struct Static {             static var instance : TPScopeManager? = nil         }         if !Static.instance {             Static.instance = TPScopeManager()         }         return Static.instance!     }}將單例實(shí)例封裝在靜態(tài)結(jié)構(gòu)中應(yīng)該允許單個(gè)實(shí)例在沒有復(fù)雜命名方案的情況下不會(huì)與單例實(shí)例發(fā)生沖突,并且應(yīng)該使事情變得相當(dāng)私密。但是很明顯,這個(gè)模型并不是線程安全的,所以我嘗試在整個(gè)過程中添加調(diào)度_ONE:class var sharedInstance:TPScopeManager {     get {         struct Static {             static var instance : TPScopeManager? = nil             static var token : dispatch_once_t = 0         }         dispatch_once(Static.token) { Static.instance = TPScopeManager() }         return Static.instance!     }}但是,我在dispatch_once行:無法將表達(dá)式的類型“void”轉(zhuǎn)換為“()”類型我嘗試過幾個(gè)不同的語法變體,但它們似乎都有相同的結(jié)果:dispatch_once(Static.token, { Static.instance = TPScopeManager() })什么是正確的用法?dispatch_once用斯威夫特?我最初認(rèn)為問題是由于()在錯(cuò)誤消息中,但是我越看它,我就越認(rèn)為這可能是一個(gè)獲得dispatch_once_t正確定義。
查看完整描述

3 回答

?
梵蒂岡之花

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個(gè)贊

TL;DR:使用類常數(shù)如果您正在使用SWIFT1.2或更高版本,并且嵌套結(jié)構(gòu)如果需要支持早期版本,請使用此方法。

根據(jù)我使用SWIFT的經(jīng)驗(yàn),有三種方法可以實(shí)現(xiàn)Singleton模式,它們支持延遲初始化和線程安全。

類常數(shù)

class?Singleton??{
???static?let?sharedInstance?=?Singleton()}

此方法支持延遲初始化,因?yàn)镾wift延遲初始化類常量(和變量),并且通過let..

SWIFT 1.2中引入了類常數(shù)。如果需要支持SWIFT的早期版本,請使用下面的嵌套結(jié)構(gòu)方法或全局常量。

嵌套結(jié)構(gòu)

class?Singleton?{
????class?var?sharedInstance:?Singleton?{
????????struct?Static?{
????????????static?let?instance:?Singleton?=?Singleton()
????????}
????????return?Static.instance????}}

這里我們使用嵌套結(jié)構(gòu)的靜態(tài)常數(shù)作為類常量。這是SWIFT1.1及更早版本中缺少靜態(tài)類常量的一種解決方法,并且仍然可以解決函數(shù)中缺少靜態(tài)常量和變量的問題。

派遣一次

傳統(tǒng)的目標(biāo)-C方法移植到SWIFT。我相當(dāng)肯定,與嵌套的struct方法相比沒有什么優(yōu)勢,但我還是把它放在這里,因?yàn)槲野l(fā)現(xiàn)語法上的差異很有趣。

class?Singleton?{
????class?var?sharedInstance:?Singleton?{
????????struct?Static?{
????????????static?var?onceToken:?dispatch_once_t?=?0
????????????static?var?instance:?Singleton??=?nil
????????}
????????dispatch_once(&Static.onceToken)?{
????????????Static.instance?=?Singleton()
????????}
????????return?Static.instance!
????}}


查看完整回答
反對 回復(fù) 2019-06-03
?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

由于Apple現(xiàn)在已經(jīng)澄清靜態(tài)struct變量被初始化為延遲并被包裝在調(diào)度_ONE中(請參閱文章末尾的注釋),我認(rèn)為我的最后解決方案將是:

class?WithSingleton?{
????class?var?sharedInstance?:WithSingleton?{
????????struct?Singleton?{
????????????static?let?instance?=?WithSingleton()
????????}

????????return?Singleton.instance????}}

這利用了靜態(tài)結(jié)構(gòu)元素的自動(dòng)延遲、線程安全初始化,向使用者安全地隱藏了實(shí)際實(shí)現(xiàn),使所有內(nèi)容保持緊湊的可讀性,并消除了一個(gè)可見的全局變量。

蘋果已經(jīng)澄清,延遲初始化程序是線程安全的,因此不需要dispatch_once或類似的保護(hù)

全局變量的延遲初始化器(也適用于結(jié)構(gòu)和枚舉的靜態(tài)成員)將在第一次訪問全局變量時(shí)運(yùn)行,并以調(diào)度_ONE的形式啟動(dòng),以確保初始化是原子的。這使得在代碼中使用調(diào)度一次的方法很酷:只需使用初始化器聲明一個(gè)全局變量,并將其標(biāo)記為私有變量即可。


查看完整回答
反對 回復(fù) 2019-06-03
  • 3 回答
  • 0 關(guān)注
  • 703 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號