關於Alamofire Manager單例的思考,AlamofireManager
今天跑到大學裡來看源碼,剛開學就有好多同學上自習,好久沒來過大學了,還是大學裡安靜。
今天看了一點Alamofire的源碼,其中Manager的單例如下:
public static let sharedInstance: Manager = { let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders return Manager(configuration: configuration) }()
上面的代碼中使用public static let 定義了單例變數sharedInstance。看到這個單例我首先想到的是這樣寫然後將init方法設定成private的,就能夠實現單例了。但是看了一下源碼,源碼中的init方法竟然是public的,後來自己給解釋了一下,可能是作者給使用者留了建立自己執行個體的入口。但是想想這樣有點違背單例的思想了。
補充一點,在OC中建立單例一般如下:
+ (AccountManager *)sharedManager { static AccountManager *sharedAccountManagerInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ sharedAccountManagerInstance = [[self alloc] init]; }); return sharedAccountManagerInstance; } 網上還有判斷sharedAccountManagerInstance是否為空白,然後建立的,但是這種方式建立的單例,在多線程的情況下,容易出現問題。具體問題可以百度。
下面想說的是對於類型方法及屬性的修飾符:static和class關鍵字。首先列出來一篇文章,看完了這篇文章之後再回來看我寫的後面。這篇文章是王巍寫的,品質挺高的,地址:http://swifter.tips/static-class/。
在王巍的文章中詳細的介紹了static和class的使用方式。簡單的概括就是struct、enum中使用static,class中儲存屬性使用static、計算屬性和方法使用class。我自己做測試了在class中計算屬性和方法使用也可以使用static,所以如果不好記,直接都使用static也可以。
轉過來看一下上面Alamofire代碼中的共用執行個體的聲明,第一次看到我以為是一個計算屬性,因為後面跟著好多代碼。但是仔細一看,其實是一個儲存屬性,在等號後面其實是一個尾隨閉包,然後使用括弧,馬上獲得了閉包返回的值,然後賦值給了該儲存屬性。(對於這個可能說法不對,我原來看過這種情況叫什麼,可能記錯了,如果錯了麻煩給我指出)。
下面是廣告:
本人分享到github上整理的swift 2.0的playground。地址https://github.com/mengxiangyue/The-Swift-2.0-Programming-Language-playground
對應最新發行《The Swift Programming Language》Swift 2.0 版本一書中內容。這些Playground基本是書中知識點的一個總結,如果不想看英文書的人看這些Palyground都看完了,也基本算是看完了書中的內容。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。