美文网首页
Alamofire源码解读:一些可借鉴的代码写法

Alamofire源码解读:一些可借鉴的代码写法

作者: GTMYang | 来源:发表于2016-12-14 09:36 被阅读0次

    这里列出了Alamofire里面的一些我平时没用到的代码细节技巧,有些东西我目前也没搞清楚为什么要这样写,如果你知道,麻烦告知,不甚感激!


    1. 单例的写法

        // 基本写法
        open static let shared: SessionManager =  SessionManager()
    
        // 加强写法,用背包附加一些初始化
        open static let shared: SessionManager ={
            let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    
            return SessionManager(configuration: configuration)
        }()
    

    2. 常量的写法

    摘Alamofire里面Notifications.swift的代码

    import Foundation
    
    extension Notification.Name {
        /// Used as a namespace for all `URLSessionTask` related notifications.
        public struct Task {
            /// Posted when a `URLSessionTask` is resumed. The notification `object` contains the resumed `URLSessionTask`.
            public static let DidResume = Notification.Name(rawValue: "org.alamofire.notification.name.task.didResume")
    
            /// Posted when a `URLSessionTask` is suspended. The notification `object` contains the suspended `URLSessionTask`.
            public static let DidSuspend = Notification.Name(rawValue: "org.alamofire.notification.name.task.didSuspend")
    
            /// Posted when a `URLSessionTask` is cancelled. The notification `object` contains the cancelled `URLSessionTask`.
            public static let DidCancel = Notification.Name(rawValue: "org.alamofire.notification.name.task.didCancel")
    
            /// Posted when a `URLSessionTask` is completed. The notification `object` contains the completed `URLSessionTask`.
            public static let DidComplete = Notification.Name(rawValue: "org.alamofire.notification.name.task.didComplete")
        }
    }
    
    // MARK: -
    
    extension Notification {
        /// Used as a namespace for all `Notification` user info dictionary keys.
        public struct Key {
            /// User info dictionary key representing the `URLSessionTask` associated with the notification.
            public static let Task = "org.alamofire.notification.key.task"
        }
    }
    

    这篇文章里讲了一部分为什么

    3. @discardableResult

    @discardableResult的作用是方法返回的结果赋值给常量或者变量,并且在后面没有使用编译器不会warring

    4. defer

    defer的作用是将后面{}中的代码延迟到return之前调用

    同样摘一段代码:

    public func writeEncodedData(to fileURL: URL) throws {
            if let bodyPartError = bodyPartError {
                throw bodyPartError
            }
    
            if FileManager.default.fileExists(atPath: fileURL.path) {
                throw AFError.multipartEncodingFailed(reason: .outputStreamFileAlreadyExists(at: fileURL))
            } else if !fileURL.isFileURL {
                throw AFError.multipartEncodingFailed(reason: .outputStreamURLInvalid(url: fileURL))
            }
    
            guard let outputStream = OutputStream(url: fileURL, append: false) else {
                throw AFError.multipartEncodingFailed(reason: .outputStreamCreationFailed(for: fileURL))
            }
    
            outputStream.open()
            /// 注意这里
            defer { outputStream.close() }
    
            self.bodyParts.first?.hasInitialBoundary = true
            self.bodyParts.last?.hasFinalBoundary = true
    
            for bodyPart in self.bodyParts {
                try write(bodyPart, to: outputStream)
            }
        }
    

    5. 锁的写法

    
        private var taskDelegate: TaskDelegate
        private var taskDelegateLock = NSLock()
    
        /// The delegate for the underlying task.
        open internal(set) var delegate: TaskDelegate {
            get {
                taskDelegateLock.lock() ; defer { taskDelegateLock.unlock() }
                return taskDelegate
            }
            set {
                taskDelegateLock.lock() ; defer { taskDelegateLock.unlock() }
                taskDelegate = newValue
            }
        }
    

    6. 可以通过加 '' 来使用关键字保留字

        /// A default instance of `SessionManager`, used by top-level Alamofire request methods, and suitable for use
        /// directly for any ad hoc requests.
        open static let `default`: SessionManager = {
            let configuration = URLSessionConfiguration.default
            configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    
            return SessionManager(configuration: configuration)
        }()
    

    相关文章

      网友评论

          本文标题:Alamofire源码解读:一些可借鉴的代码写法

          本文链接:https://www.haomeiwen.com/subject/tscimttx.html