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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 22:41:52

关于Alamofire Manager单例的思考的相关文章

C++单例类设计模式的思考

本次博文假设有一个Manager管理类,并以此为探究单例类的设计模式. 一般作法 类声明: class Manager{ public: ~Manager(); //提供单例对象访问 static Manager* getInstance(); //删除单例对象 void deleteInstance(); void dosometing(); private: //构造函数声明为 保护方法 Manager(); //单例对象指针 static Manager* s_Manager; }; 类方

unity泛型单例

参考自:http://wiki.unity3d.com/index.php/Singleton 我们要使用Unity3d在Object类中提供了一个静态函数 :Object.DontDestroyOnLoad (Object target) . 加载新场景的时候使单例对象不被自动销毁 作为 MonoBehaviour 因为我们可能需要协同程序,所以使用 Lock同步 用法示例 MyClass.cs public class MyClass : MonoBehaviour { void Awake

Swift中编写单例的正确方式

Swift中编写单例的正确方式 2015-12-07 10:23 编辑: yunpeng.hu 分类:Swift 来源:CocoaChina翻译活动 14 10647 Objective-CSwift单例 招聘信息: Cocos2d-x 工程师 cocos2dx手游客户端主程 wp开发 iOS开发工程师 iOS软件工程师 iOS研发工程师 iOS讲师 iOS开发工程师 iOS高级开发工程师 iOS 高级软件工程师 iOS高级开发工程师 本文由CocoaChina译者leon(社区ID)翻译自kr

Spring 4.2 方法注入解决单例Bean的原型Bean依赖问题

当你在单例Bean中使用原型Bean依赖时,注意,依赖在实例化时解析.因此,如果你依赖注入一个原型Bean到单例Bean中,新的原型Bean被实例化然后依赖注入到单例Bean中.提供给单例Bean的原型实例是唯一的. 然而,假设你想单例Bean在运行时多次获取一个新的原型Bean的实例.你不能依赖注入一个原型Bean到你的单例Bean中,因为注入只发生一次,当Spring容器实例化单例Bean时解析并注入它的依赖.如果你在运行时多次需要一个新的原型Bean,可以使用方法注入. 在大多数应用程序情

IOS_地图_定位_天气预报_Block回调_单例

H:/1021/00_block回调.h /* 通过block回调 定义block代码块,目的是解析完成之后调用 返回值是 void 参数是 数组,里面的每个成员是一个NSString*/ typedef void(^WeatherFinishedBlock)(NSArray *dataList); @interface WeatherXMLPaser : NSObject // 解析器解析数据,参数1是要解析的数据,参数2是解析完毕回调的代码块 - (void)parserWeatherDat

IOS 定位 单例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 + (SCLocationController *)sharedController {      static SCLocationController *sharedController = nil;     

设计模式之单例

一.单例设计模式实例举例 单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一. 这里又不具体讲如何实现单例模式和介绍其原理(因为这方便的已经有太多的好文章介绍了),如果对单例模式不了解的可以先看下:http://terrylee.cnblogs.com/archive/2005/12/09/293509.html

有一鲜为人知的单例写法-ThreadLocal

还有一鲜为人知的单例写法-ThreadLocal 源码范例 当我阅读FocusFinder和Choreographer的时候,我发现这两类的单例实现和我们平常用双重检查锁很不一样.而是用来一个ThreadLocal,这个也可以实现单例啊,那这个与双重检查锁实现的单例有什么区别呢? 1.FocusFinder /** * The algorithm used for finding the next focusable view in a given direction * from a view

静态类和单例区别

近期在看android的网络访问类的时候发现有些人用静态类来封装,有些人用单例来封装,突然发现,两种都可以,那究竟使用哪种好呢?这个答案并非是绝对的,两种都可以.就像是抽象类和接口一样,其实很多情况两种方式都可以达到目的,就是看个人理解(抽象类和接口的区别看我的另外一篇文章 接口和抽象类区别).以下是个人的一些看法. 静态类就像是面向过程时代的方法与一样,是一个工具类,很少依赖其他对象或者资源,只是在面向对象的思想中,一定要用类,而不用像面向过程时代直接调用方法,所以用面向对象封装的特性,才用静