【Alamofire源码解析】02 - AFError & Notifications & DispatchQueue+Alamofire

一、AFError枚举

作者首先把整个项目中遇到的error都集中在AFError枚举。从源码中我们可以看到,项目中遇到的error有五大类,就是AFError的五个case,每个case都有一个关联值(什么是关联值 >>)。我们利用Swift枚举的关联值特性,在抛出错误的时候,关联一个任何类型的值。例如如果是这个错误case invalidURL(url: URLConvertible),这里关联了一个url,这样就可以在遇到error的时候,告诉我们哪个url是不合法的。而其他四个case关联的都是AFError里面内置的enum类型(Swift允许类型嵌套),可以告诉我们更具体的错误原因。

public enum AFError: Error {

    // 参数编码失败的原因
    public enum ParameterEncodingFailureReason {
    
    }

    // 多表单数据编码失败的原因
    public enum MultipartEncodingFailureReason {
    
    }

    // 响应验证失败的原因
    public enum ResponseValidationFailureReason {

    }

    // 响应序列化失败的原因
    public enum ResponseSerializationFailureReason {

    }

    // 五大类错误
    case invalidURL(url: URLConvertible)
    case parameterEncodingFailed(reason: ParameterEncodingFailureReason)
    case multipartEncodingFailed(reason: MultipartEncodingFailureReason)
    case responseValidationFailed(reason: ResponseValidationFailureReason)
    case responseSerializationFailed(reason: ResponseSerializationFailureReason)
}

二、AdapterError

这个AdapterError是专门为RequestAdapter服务的。

这里先简单介绍下RequestAdapterRequestAdapter是个协议,我们可以自定义一个请求适配器,并且遵循这个协议。通过我们自定义的适配器,我们在发送请求的时候可以默认添加一些请求相关的数据,具体请查看:【Alamofire源码解析】08 - Request。

AdapterError就是在请求适配过程中可能出现的错误的结构类型。在Error的extension中定义的underlyingAdaptError就是适配过程中可能出现的错误。

三、Error Booleans

这里定义了一些方便使用的只读属性,方便我们在开发的时候作出判断。其实在我们的开发中,也会经常把一些判断写成只读属性或者是一个返回Bool的方法。这是一个非常好的习惯,提高代码的可读性。在Swift中,苹果已经习惯性地把Bool类型的属性以is开头命名,我个人也觉得用is开头命名,可读性会更高。

extension AFError {
    public var isInvalidURLError: Bool {
        if case .invalidURL = self { return true }
        return false
    }
    
    // 更多 Error Booleans ...
}

四、Convenience Properties

这部分内容是一些方便使用的与error相关的属性,没有很特别的。

五、Notifications

Notifications这个文件通过扩展Notification.Name定义了项目中用到的通知名称。我们可以学习用这个形式来定义rawValueorg.alamofire.notification.name.task.didResume。另外还定义了一个Key。

六、DispatchQueue+Alamofire

DispatchQueue+Alamofire里面,通过扩展DispatchQueue定义了不同优先级的全局队列:

  • userInteractive:与用户交互的任务队列,通常跟UI的刷新有关,例如动画之类的
  • userInitiated:用户发起的并且需要立即得到结果的任务队列
  • utility:需要花点时间的任务队列
  • background:后台任务队列,用户不需要关心的,通常时间会比较长

另外还定义了一个方法,经过一个指定的时间后,执行一个closure,这种写法看起来更通熟易懂:

func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
    asyncAfter(deadline: .now() + delay, execute: closure)
}

有任何问题,欢迎大家留言!

欢迎加入我管理的Swift开发群:536353151,本群只讨论Swift相关内容。

原创文章,转载请注明出处。谢谢!

你可能感兴趣的:(【Alamofire源码解析】02 - AFError & Notifications & DispatchQueue+Alamofire)