关于Alamofire Manager单例的思考

今天跑到大学里来看源码,刚开学就有好多同学上自习,好久没来过大学了,还是大学里安静。

今天看了一点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都看完了,也基本算是看完了书中的内容。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mengxiangyue/article/details/48413925
个人分类: swift
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭