在軟件開發中,調試模塊,Log模塊,可視化監控模塊等都屬於技術需求,並不是業務需求,所以在進行這類模塊的構建時,咱們更多的應該以面向切面的思想來編程。例如Log模塊,其每每只是在Debug模式下須要,在編寫時就要注意讓其能夠自動適應編譯環境而不需代碼作切換操做。git
本篇博客主要介紹爲項目添加Log模塊的開發思路,而且推薦一款開源而且支持Cocoapods的Log庫。github
面向切面編程的核心就是要足夠簡潔,不影響主體工程模塊,不依賴也不引入任何其餘模塊的內容。Log引擎的接口設計能夠所有采用宏的模式,使用預編譯關鍵字能夠十分容易的對Debug和Release環境進行分別處理,以下:編程
#ifndef YHDevLog #define YHDevlOG #ifdef DEBUG #define START_DEBUG_MODE() [YHDevLogManager installDevLogView]; #define WARN_LOG(msg,...) [YHDevLogManager pushLog:0 format:msg,##__VA_ARGS__,nil]; #define ERROR_LOG(msg,...) [YHDevLogManager pushLog:1 format:msg,##__VA_ARGS__,nil]; #define LOG(msg,...) [YHDevLogManager pushLog:2 format:msg,##__VA_ARGS__,nil]; #else #define START_DEBUG_MODE() #define WARN_LOG(msg,...) #define ERROR_LOG(msg,...) #define LOG(msg,...) #endif #endif
其中,WARN_LOG,ERROR_LOG,LOG三個宏用來進行不一樣級別的Log打印,而且提供了格式化字符串的支持。START_DEBUG_MODE()宏用來開啓模塊,能夠在應用程序啓動完成後調用開啓。atom
Log信息是純文本的,可是咱們須要將其抽象成一種Model來進行描述,區分Log的級別,類型或者其餘邏輯,YHDevLog中的Model設計以下:spa
@interface YHDevLogModel : NSObject @property(nonatomic,strong)NSString * content; /** 0 warn 1 error 2 plain */ @property(nonatomic,assign)int type; //是否展開詳情 @property(nonatomic,assign)BOOL isOpen; @end
關於Log窗口,咱們能夠採用懸浮window的方式,爲了不影響主應用功能,窗口的懸浮模式應該能夠自由調整,窗口中可使用TableView來展現Log信息,使用功能按鈕來控制窗口尺寸和進行Log的分類和清空等。關於UI方面的代碼,由於採用的是純手寫的Autolayout,這裏就不在列舉代碼,有興趣的能夠再以下地址找到:設計
https://github.com/ZYHshao/YHDevLog調試
一些效果圖:code
使用下面的Pod能夠直接使用此Log組件:orm
pod 'YHDevLog' 接口
歡迎共同探討,一塊兒進步!