swift 协议SDK WisdomProtocol

WisdomProtocol SDK 面向协议编程

Welcome to use WisdomProtocol

一. 简介:

 WisdomProtocol:一款 iOS 面向协议 编程框架,Swift特别版。

 在开发中,以遵守实现 对应协议,即可得到 相应能力 的理念,来定义一批定制的协议,通过他们绑定实现定制的功能和需求。

 协议功能 支持 如下列表。

 cocoapods 集成(不支持路由功能自动注册):pod 'WisdomProtocol', '0.2.3'

 cocoapods 集成(支持路由功能自动注册) :pod 'WisdomProtocol/Router', '0.2.3'

二. 协议功能支持:

 1). 定时器功能

 2). 模型: 编/解码

 3). 程序信息跟踪捕获(崩溃日志,控制器展示时间统计,主线程卡顿fps值 和 卡顿监控详情捕获)

 4). 图片: 本地,网络加载/缓存

 5). 多语言切换/配置

 6). 网络连接状态监听

 7). 7大路由器

三. 功能详情:

【1】定时器功能
-> 定时继承主协议:

  @objc public protocol WisdomTimerable

  简介:
  继承定时协议 对象,拥有开启计时的能力,且不用管理内部定时器的生命周期。下面具体介绍协议的几个方法API。
 -> 定时功能协议:

  // MARK: Class Timerable Protocol
  // * Support for objective-c/Swift Class
  @objc public protocol WisdomTimerable {

      // MARK: Class Param - UInt, WisdomTimerable
      // * Timer task in progress, current time
      @objc func timerable(timerDid currentTime: UInt, timerable: WisdomTimerable)

      // MARK: Class Param - WisdomTimerable
      // * Example End a scheduled task
      @objc func timerable(timerEnd timerable: WisdomTimerable)
  }

-> 定时任务说明:

  1.支持 Swift / OC 类遵守,且协议简单明了
  2.支持 每秒任务状态更新回调 和 定时任务结束状态回调

  extension WisdomTimerable {
  
      // MARK: Class Param - NSInteger.  No need to implement 
      // * Start a forward timer task, start the forward time point
      public func startForwardTimer(startTime: UInt)
 
      // MARK: Class Param - NSInteger.  No need to implement 
      // * Start a countdown timer task, start the total time countdown
      public func startDownTimer(totalTime: UInt)
 
      // MARK: Class Timer - destroy.  No need to implement 
      // Destruction/Release timer task
      public func destroyTimer()
  }
  • 支持 从指定时间开始累积计时 和 总时间的倒计时

  • 支持 主动摧毁运行中的定时任务
    -> 支持功能:

    • 累积计时: public func startForwardTimer(startTime: UInt)
    • 倒计时: public func startDownTimer(totalTime: UInt)
      【优势/特点】

    -> 开发者无需关心,定时任务的创建和销毁。对于销毁,内部会即时销毁,包括任务结束即时销毁,包括启动任务对象销毁,也会即时销毁定时任务;
    -> 定时任务过程中,app前后台状态切换,会对定时数产生的影响,已妥善计算处理,放心使用;

【2】模型 编/解码
-> 模型 编/解码 继承主协议:

  // MARK: Swift Class/NSObject/Value to coding/decoding Protocol
  public protocol WisdomCodingable {}

  简介:
  继承编/解码协议 对象,拥有对模型和数据编/解吗的能力,且支持集合,结构体,枚举类型。下面具体介绍协议的几个方法API。

-> 模型 几种解码场景:

  extension WisdomCodingable where Self: Decodable {

      // MARK: Param - [String: Any], return - Self?
      // swift dictionary to dictionary model, use 'Decodable' protocol
      public static func decodable(value: [String: Any])->Self?{}
 
      // MARK: Param - [String: Any], return - [Self]
      // swift dictionary list to dictionary model list, use 'Decodable' protocol
      public static func decodable(list: [[String: Any]])->[Self]{}
 
      // MARK: Param - String, return - Self?
      // swift json string to model, use 'Decodable' protocol
      public static func jsonable(json: String)->Self?{}
 
      // MARK: Param - String, return - [Self]
      // swift jsons string to model list, use 'Decodable' protocol
      public static func jsonable(jsons: String)->[Self]{}
  }

解码 上到下顺序:

  1. 字典 转 模型 

  2. 字典数组 转 模型数组 

  3. Json 转 模型 

  4. Json 转 模型数组

-> 模型 几种编码场景:

  extension WisdomCodingable where Self: Encodable {

      // MARK: return - String?
      // swift model to json string, use 'Encodable' protocol
      public func ableJson()->String?{}
 
      // MARK: return - [String:Any]?
      // swift model to dictionary, use 'Encodable' protocol
      public func ableEncod()->[String:Any]?{}
  }

-> 模型 集合编码场景:

  public extension Array where Element: WisdomCodingable&Encodable {

      // MARK: return - [[String:Any]]
      // swift model list to dictionary list, use 'Encodable' protocol
      func ableEncod()->[[String:Any]]{}

      // MARK: return - String?
      // swift model list to jsons string, use 'Encodable' protocol
      func ableJsons()->String?{}
  }

编码 上到下顺序:

  1. 模型 转 Json  

  2. 模型 转 字典 

  3. 模型数组 转 字典数组

  4. 模型数组 转Json

-> 模型 案例:

  // 必须继承 Codable 和 WisdomCodingable 协议
  struct RCProductFuncModel: Codable, WisdomCodingable {

      private(set) var tag: RCProductFuncStauts?
      private(set) var name: String?
  }
  // 转模型
  let product = RCProductFuncModel.jsonable(jsons: ".....") 
  // 等等

【优势/特点】:

 -> 只支持 Swift 类,枚举,struct 的 编/解码;

 -> 内部 编/解码 实现,使用的 Swift原生Coding协议,所以不需要担心稳定性和兼容性;

 -> 解析流程中添加了断言处理:

  assert(able != nil, "decodable failure: \(value)")
  调试环境,断言 便于即时发现不合格数据,即时检测;
  如果不需要,可以注释此处断言代码;

【3】程序信息跟踪捕获
目前支持跟踪功能:

  1. 崩溃信息的跟踪捕获;
  2. OC 和Swift 语言崩溃场景抓取不一样,但是 WisdomProtocol 同时都支持;
  3. 协议限制 条件对象:UIApplicationDelegate
      例如:
      protocol WisdomCrashCatchingable where Self: UIApplicationDelegate
  4. 控制器的 显示/掩藏 状态跟踪,和显示时间统计;
  5. 主线程卡顿fps值 和 卡顿监控详情捕获;

1). 崩溃跟踪协议:

  @objc public protocol WisdomCrashCatchingable where Self: UIApplicationDelegate {

      // MARK: Crash Catching Param - String
      // Swift object type, this parameter is valid in the relase environment but invalid in the debug environment
      // objective-c object type, both debug and relase environments are supported
      @objc func crashCatching(crash: String)
  }

  说明:
  崩溃跟踪,同时支持OC和Swift 语言崩溃场景抓取。

  协议使用案例:
  extension AppDelegate: WisdomCrashCatchingable {
      //崩溃跟踪
      func crashCatching(crash: String) {
      //  crash 崩溃消息
      }
  }

2). 控制器展示跟踪协议:

  @objc public protocol WisdomTrackCatchingable where Self: UIApplicationDelegate {

      // MARK: Track Catching Controller Param - String, String
      // UIViewController Catch Controller 'viewDidAppear'
      // - controller: UIViewController.Type
      // - title: String
      @objc func trackCatching(viewDidAppear controller: UIViewController.Type, title: String)

      // MARK: Track Catching Controller Param - String, String
      // UIViewController Catch Controller 'viewDidDisappear'
      // - controller: UIViewController.Type
      // - appearTime: NSInteger
      // - title: String
      @objc optional func trackCatching(viewDidDisappear controller:      UIViewController.Type, appearTime: NSInteger, title: String)
  }

说明:
控制器将要隐藏协议回调中,会带过来时间参数,为当前控制器所展示的时长。

  协议使用案例:
  extension AppDelegate: WisdomTrackCatchingable {
      //页面跟踪
      func trackCatching(viewDidAppear controller: UIViewController.Type, title: String) {
      //  controller/title 页面展示消息
      }

      @objc optional func trackCatching(viewDidDisappear controller: UIViewController.Type, appearTime: NSInteger, title: String) {
      //  controller/title 页面隐藏消息,appearTime 展示到隐藏,中间统计时间
      }
  }

3). 主线程界面 FPS 刷新帧率日志捕捉协议:

  @objc public protocol WisdomFPSCatchingable where Self: UIApplicationDelegate {

      // MARK: FPS Catching Param - Double, String
      // Main thread Catching FPS
      // - currentMain fps: Double
      // - description: String
      @objc func fpsCatching(currentMain fps: Double, description: String)
  }

说明:
FPS 是监控的主线程卡顿值,只支持 Debug 环境监控,不支持 Release 环境监控,不支持模拟器。

  协议使用案例:
  extension AppDelegate: WisdomFPSCatchingable {
      // 主线程 fps 时时监控
      func fpsCatching(currentMain fps: Double, description: String) {
      //   print("FPS: \(fps) \(description)")
      }
  }

4). 主线程卡顿具体信息日志捕捉协议:

  @objc public protocol WisdomFluecyCatchingable where Self: UIApplicationDelegate {

      // MARK: Fluecy Catching Param - Double, String
      // - description: String
      @objc func getFluecyCatchTime(description: String)->TimeInterval

      // MARK: Fluecy Catching Param - Double, String
      // Main thread Catching Fluecy
      // - currentMain info: String
      @objc func fluecyCatching(currentMain info: String, description: String)
  }

说明:
先设置主线程捕获 卡顿时长,出现卡顿时并捕获,只支持 Debug 环境监控,不支持 Release 环境监控,不支持模拟器。

  协议使用案例:
  extension AppDelegate: WisdomFluecyCatchingable {

      func getFluecyCatchTime(description: String) -> TimeInterval {
         return 2 // 设置主线程捕获 卡顿时长
      }

      func fluecyCatching(currentMain info: String, description: String) {
      // print(info)
      }
  }

【4】图片 缓存/加载
1). UIImage 本地缓存 和 本地加载 扩展:

  // * Save/Load Image in Memory/Disk Cache *
  extension UIImage {

      // MARK: Save Image in Memory Cache / Disk Cache
      // imageName: Image Name
      @objc public func saveingable(imageName: String) 
 
      // MARK: Load Image in Memory Cache / Disk Cache
      // imageName:    Image Name
      // imageClosure: (UIImage,String)->() (has UIImage)
      // emptyClosure: ()->()               (no UIImage)
      @objc public static func loadingable(imageName: String, imageClosure: @escaping (UIImage,String)->(), emptyClosure: @escaping ()->())
  }

–> UIImage 本地缓存 案例:

  // 按照 imageName 保存
  UIImage().saveingable(imageName: “本地缓存图片名称”)
 --> UIImage 本地加载 案例:

  UIImage.loadingable(imageName: “本地缓存图片名称” ) { image, imageName in
    // 获取到本地缓存到图片
  } emptyClosure: {
    // 本地没有缓存的图片 
  }

说明:
-> 图片本地缓存为沙盒缓存,如果app内存吃紧,缓存图片会被清除。
-> 图片获取缓存过程:内存缓存 -> 磁盘缓存。
2). UIImageView本地缓存 和 网络加载 扩展:

  extension UIImageView {
      // MARK: Load Image in Memory Cache / Disk Cache
     // imageName:        Image Name (historical save Memory/Disk Cache)
     // placeholderImage: Placeholder picture (Memory/Disk Cache no Image)
     @objc public func loadingImageable(imageName: String, placeholderImage: UIImage?=nil)

      // MARK: Load Image in Network / Memory Cache / Disk Cache
      // imageUrl:         Image Url (historical save Memory/Disk Cache, if not, network download)
      // placeholderImage: Placeholder picture (Memory/Disk Cache no Image)
      @objc public func loadingImageable(imageUrl: String, placeholderImage: UIImage?=nil)
  }

  说明:
  -> 第一种,根据 imageName 只在本地缓存中加载图片;
  -> 第二种,先本地加载缓存图片,在没有的情况,继续根据 imageUrl 进行网络下载,下载完成做本地缓存;
 3). UIImageView图片动态跟踪 扩展:

  extension UIImageView {

      // MARK: Tracking save Image in Memory Cache / Disk Cache, Paired use
      // Tracking UIImage ‘@objc public func saveingable(imageName: String)’ method, update icon
      // 当有图片本地缓存, 调用 UIImage ‘@objc public func saveingable(imageName: String)’ 方法时,对跟踪图片控件,刷新图片
      @objc public func trackingImageable()

      // MARK: Missing save Image in Memory Cache / Disk Cache, Paired use
      // Make UIImage ‘@objc public func trackingImageable()’ method Missing
      // 使对跟踪图片控件刷新失效,失效设置 UIImage ‘@objc public func saveingable(imageName: String)’ 方法
      @objc public func missingImageable()
  }

  说明:
  -> ‘func trackingImageable()’: 设置对本地图片缓存任务,进行监听,并重新刷新之前UIImageView加载失败的图片;
  -> ‘func missingImageable()’:  使 ‘func trackingImageable()’监听任务失效,不再刷新之前UIImageView加载失败的图片;

【5】多语言切换
1). 多语言支持种类 枚举:

  @objc public enum WisdomLanguageStatus: Int
 -> 具体类型:

  /// 跟随系统语言
  case system=1
  /// 英语
  case en
  /// 简体中文
  case zh_Hans
  /// 繁体中文
  case zh_Hant
  /// 繁体中文(香港特别行政区)
  case zh_Hant_HK
  /// 繁体中文(中国台湾省)
  case zh_Hant_TW
  /// 法语
  case fr
  /// 德语
  case de
  /// 意大利语
  case it
  /// 日语
  case ja
  /// 韩语
  case ko
  /// 葡萄牙语
  case pt_PT
  /// 俄语
  case ru
  /// 西班牙语
  case es
  /// 荷兰语
  case nl
  /// 泰语
  case th
  /// 阿拉伯语
  case ar
  /// 乌克兰
  case uk

2). 多语言功能注册 协议:

  // MARK: Language Registerable
  @objc public protocol WisdomLanguageRegisterable where Self: UIApplicationDelegate

  说明:
  -> 在使用多语言主协议功能前,需要实现 多语言功能注册 协议,如果未实现多语言注册协议,多语言主协议功能 不可用;
  -> WisdomLanguageRegisterabl限制 UIApplicationDelegate 实现;
 -> 具体功能注册:

  // MARK: Language Registerable
  @objc public protocol WisdomLanguageRegisterable where Self: UIApplicationDelegate {

      // MARK: return - String?
      // Get the 'String' local save language key
      @objc func registerLanguageKey()->String?

      // MARK: Param - WisdomLanguageStatus, return - Bundle
      // Get the ‘Bundle’ based on the type
      @objc func registerLanguage(language: WisdomLanguageStatus)->Bundle
 
      // MARK: Param - WisdomLanguageStatus
      // Current Language Update
      @objc func registerLanguageUpdate(language: WisdomLanguageStatus)
 }

 说明:
 -> registerLanguageKey():              本地保存语言设置类型的key,每次保存/获取本地设置,会调用。设置nil 不做本地缓存;
 -> registerLanguage(language: WisdomLanguageStatus)->Bundle:  根据WisdomLanguageStatus获取多语言资源Bundle;
 -> registerLanguageUpdate(language: WisdomLanguageStatus):    更新当前设置的语言类型 WisdomLanguageStatus 时调用;

3). 多语言功能主 协议:

 @objc public protocol WisdomLanguageable
 -> 具体功能:

 extension WisdomLanguageable {

      // MARK: return - WisdomLanguageStatus?
      // Gets the language type of the setting
      public static func getCurrentLanguage()->WisdomLanguageStatus?
 
      // MARK: return - String
      // Gets the language type of the System
      public static func getSystemLanguage()->String
 
      // MARK: Param - WisdomLanguageStatus, return - Bool
      // Update Language
      @discardableResult
      public static func updateLanguage(language: WisdomLanguageStatus)->Bool
 
      // MARK: Reset Language
      public static func resetLanguage()
 }

 说明:
 -> getCurrentLanguage():                           获取当前设置的语言类型 WisdomLanguageStatus,未设置 为nil;
 -> getSystemLanguage():                            获取当前系统的语言类型 WisdomLanguageStatus;
 -> updateLanguage(language: WisdomLanguageStatus): 更新当前系统的语言类型 WisdomLanguageStatus;
 -> resetLanguage():                                重置当前系统的语言类型 WisdomLanguageStatus,设置为nil;

4). 多语言协议注册案例:

      extension AppDelegate: WisdomLanguageRegisterable {

      func registerLanguageKey()->String? {
         return "Language"
      }

      func registerLanguage(language: WisdomLanguageStatus)->Bundle {
         let bundlePath = (Bundle.main.path(forResource: "RainbowStone", ofType: "bundle") ?? "")
         var path = bundlePath+"/Lan/"+language.file_lproj
         var bundle: Bundle?
         switch language {
         case .zh_Hans, .zh_Hant, .zh_Hant_HK, .zh_Hant_TW:
            path = bundlePath+"/Lan/"+WisdomLanguageStatus.zh_Hans.file_lproj
            bundle = Bundle.init(path: path)
         default:
            path = bundlePath+"/Lan/"+WisdomLanguageStatus.en.file_lproj
            bundle = Bundle.init(path: path)
         }
         return bundle ?? Bundle.main
      }

      func registerLanguageUpdate(language: WisdomLanguageStatus) {
         // 语言切换回调
      }
 }

说明:
-> 案例只设置了 中/英 文切换;
-> 根据参数 WisdomLanguageStatus 类型,返回对应的Bundle类型;
5). 多语言协议使用案例:

  class RCUpdate: WisdomLanguageable{}

  说明:
  -> 继承 WisdomLanguageable 协议的对象,即拥有了获取当前语言设置信息的功能,和设置切换当前语言的功能;

【6】网络连接状态监听
1). 网络状态 枚举:

 @objc public enum WisdomNetworkReachabilityStatus: NSInteger {

      /// It is unknown whether the network is reachable.
      case unknown=0
      /// The network is not reachable.
      case notReachable
      /// 蜂窝网络
      case cellular
      /// 以太网/WiFicase ethernetOrWiFi
 }

2). 获取当前网络状态信息:

 extension WisdomNetworkReachabilityStatus {

      // MARK: get 'currentNetworkReachabilityState: WisdomNetworkReachabilityStatus'
      public static var currentNetworkReachabilityState: WisdomNetworkReachabilityStatus
 
      // MARK: Whether the network is available network: 'cellular / ethernetOrWiFi'
      public static var isCurrentReachable: Bool 
 
      // MARK: Whether the current network is a cellular network: 'cellular'
      public static var isCurrentReachableOnCellular: Bool 
 
      // MARK: Whether the current network is Ethernet / WiFi network: 'ethernetOrWiFi'
      public static var isCurrentReachableOnEthernetOrWiFi: Bool
 }

 说明:
 -> current:                   获取当前网络状态;
 -> isCurrentReachable:        当前网络状态是否有网(蜂窝网络或者以太网或者Wi-Fi);
 -> isCurrentOnCellular:       当前网络状态是否是 蜂窝网络;
 -> isCurrentOnEthernetOrWiFi: 当前网络状态是否是 以太网或者Wi-Fi;

3). 网络状态主协议:

 @objc public protocol WisdomNetworkReachabilityable {

      // MARK: networkReachability 'WisdomNetworkReachabilityStatus' - didChange
      // * network reachability did change
      @objc func networkReachability(didChange currentState: WisdomNetworkReachabilityStatus)
 }

 说明:
 -> 需要监听网络状态变化,对象必须继承此协议,并实现协议方法;
 -> 对象继承协议完成好,就可以去 开启/关闭 监听;

4). 网络状态监听 开启/关闭:

 extension WisdomNetworkReachabilityable {

      // MARK: self start 'WisdomNetworkReachabilityStatus' Listening. < No need to implement >
      public func startReachabilityListening()

      // MARK: self stop 'WisdomNetworkReachabilityStatus' Listening. < No need to implement >
      public func stopReachabilityListening()
 }

5). 网络状态监听 案例:

 class RCMsgUser: WisdomNetworkReachabilityable {
      init(userId: String) {
         // 开启网络监听
         startReachabilityListening()
      }
 
      deinit {
      // 释放,停止网络监听
         stopReachabilityListening()
      }
 
      // 网络状态变化回调
      func networkReachability(didChange currentState: WisdomNetworkReachabilityStatus) {
          // 监听网络变化,想做的事情
      }
 }

 说明:
 -> 网络状态监听,使用比较简单,同时支持 OC 和 Swift;
 -> 性能方面,内部实现,网络状态对象不会频繁创建,会复用对象功能;

如果您热衷于iOS/swift开发,是一位热爱学习进步的童鞋,欢迎来一起研究/讨论 开发中遇到的问题。联系QQ:497609288 。 请给予我支持,我会继续我的创作。

If you are keen on iOS/swift development, you are a child who loves learning and progress, welcome to study/discuss the problems encountered in the development together. Contact QQ: 497609288. Please give me your support and I will continue my creation.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值