zoukankan      html  css  js  c++  java
  • Alamofire 4.0 & swift 3.0 学习

      在这前,已经介绍并学习过AFNetworking源码了,现在通过阅读学习Alamofire最新源码同时,学习swift 3.0这门语言,虽然swift programming language已经看过,但是没有实际例子语法性的东西真的很容易就忘记。这里会简单绍Alamofire最新源码的架构,并且学习swift 3.0这门语言,透过Alamofire学习优秀的swift 3.0用法并记录,加深记忆。


        Alamofire 简述

      其实alamofire跟AFNetworking做的事情是一样的,所以会非常想似,架构,思路等,所以细节实现并不会很深入写。大概的类结构及关系如下:

    1、Alamofire是用来提供对外接口的,最终调用都被接到SessionManager,SessionManager依赖ParameterEncoding把参数,数据等生成请求,再依赖SessionDelegate生成sessionTask,每个task都与TaskDelegate成对的包装在Request里。服务器数据的返回会很到SessionDelegate,到被分发到对应的taskDelegate。当完成时,就会调用Request预设置的block任务。前依赖ResponseSerializer对数据进行返序列化,再通过block回调给使用者。以下为它的流程图:

    说明:带括号里面的并不是真正的函数调用,只是一些说明,为了概括一下逻辑,省略了一些细节。


    首先要看到的是它的对外接口Alamofire.swift,在这里面定义了很多网络请求的接口。

      1、swift中会加上了OC没有的命名空间,很好的解决了命字冲突的问题。

      外部调用接口时我们可以看到是这样的

            let urlString = "https://httpbin.org/get"
            // When
            let request = Alamofire.request(urlString, parameters: ["foo": "bar"])

    它所有接口都是交给SessionManager了。

    以下是一个例子

    public func request(
        _ url: URLConvertible,
        method: HTTPMethod = .get,
        parameters: Parameters? = nil,
        encoding: ParameterEncoding = URLEncoding.default,
        headers: HTTPHeaders? = nil)
        -> DataRequest
    {
        return SessionManager.default.request(
            url,
            method: method,
            parameters: parameters,
            encoding: encoding,
            headers: headers
        )
    }

    这里可以看到,2、swift函数可以有默认参数了,这个吸取了c的优点,在多参数并大多数情况参数是固定的情况这个非常不错的特性,填参是个多麻烦的事情呀。跳进default可以看到

        /// directly for any ad hoc requests.
        open static let `default`: SessionManager = {
            let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    
            return SessionManager(configuration: configuration)
        }()

    这里的语法有点奇怪。

    3、这里其实就是使用一个闭包或函数来初始化一个变量。这样的好处就是很方便的在构造对象前进行一些默认值的设置。Alamofire里面也有大量这样的用法。

    4、同样我们可以看到这里会有个关键字open。这个是swift3.0才有的,这里就跟swift的访问控制相关。在swift中会有模块及源文件的概念。

    模块:指的是一个单独的代码集合,如一个framework,一个bundle,一个单独的子工程里的所有文件。

    源文件指的是:一个个单一swift源码文件。

    访问控制

    open:公开的,同部外部模块都可访问,这个开放性最大。

    public:也是公开的,但还是与open有所区别,

    internal:模块内部的,即同一模块内可以访问,其它模块不能访问。

    private:私有的,这个指在内一类内部可访问

    fileprivate:文件私有的,这个指在同一类内并且在同一源文件内可访问。extension 可以在另一个源文件扩展一个类,此时如果原类中是fileprivate,在扩展的类中也不能访问,如果是private,那么在扩展类中也是可以访问的。

    open与public区别:public在只能限制在定义所在模块内部进行继承与方法的重写,而open则是只要模块有被import,在可在此模块中继承或者重写被import进来的模块中的类或方法。

    对于为什么没有protected,swift的设计者们是这样考虑的:https://developer.apple.com/swift/blog/?id=11

    一个public的类的内部成员默认是internal的。

    open internal(set) var delegate: TaskDelegate

  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/chenxianming/p/5992973.html
Copyright © 2011-2022 走看看