每周完成一个 ARTS:
Algorithm: 每周至少做一个 LeetCode 的算法题
Review: 阅读并点评至少一篇英文技术文章
Tips: 学习至少一个技术技巧
Share: 分享一篇有观点和思考的技术文章
zgpeace 立个 Flag:坚持 ARTS 10 年,今天是 2020-05-04 ~ 2030-05-04,漏掉一次微信群发红包 100 大洋。
1. Algorithm: 每周至少做一个 LeetCode 的算法题
203. Remove Linked List Elements
Easy
141884Add to ListShare
Remove all elements from a linked list of integers that have value val.
Example:
Input: 1->2->6->3->4->5->6, val = 6Output: 1->2->3->4->5
复制代码
Iteration 顺序执行
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution { public ListNode removeElements(ListNode head, int val) { ListNode fakeHead = new ListNode(-1); fakeHead.next = head; ListNode pre = fakeHead; while (head != null) { if (head.val == val) { pre.next = head.next; } else { pre = head; }
head = head.next; }
return fakeHead.next; }
}
复制代码
Recursive 递归执行
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution { public ListNode removeElements(ListNode head, int val) { // exit condition if (head == null) return null; // recursive from tail to head. head.next = removeElements(head.next, val); return head.val == val ? head.next : head; }}
复制代码
2. Review: 阅读并点评至少一篇英文技术文章
iOS Architecture: Exploring RIBs
https://medium.com/@stasost/ios-architecture-exploring-ribs-3db765284fd8
demo 代码的结构图
RIB 的全称为 Router Interactor Builder. 实际上架构无非就解决两个问题,容易维护,可扩展。
RIB 是 VIPER 架构的子集,把大业务模块打散,变成只能模块。RIB 里面介绍了是基于接口编程 Protocol,这样子的好处在于单元测试的时候,各个模块都可以 Mock 模拟数据,达到 100% Test Case 覆盖率(不过 Mock 需要依赖第三方工具)。这个确实很强。
笔者下载了 Demo 代码,发现有第三方库 RxRelay, RxSwift, 可见响应式编程应用还比较广泛。
3. Tips: 学习至少一个技术技巧
iOS 对数据的请求后,需要拦截做日志分析。如果每个网络回调都单独处理,就违反了第一职责原则(Simple Responsible Protocol - SRP)。 所以笔者找到了 AOP 处理的技巧,iOS 在 URLConnection, URLSession 都可以用 URLProtocol 来实现 AOP。
用 URLProtocol 拦截 Alamofire 的请求
var requestCount: Int = 0let protocolKey: String = "ZgpeaceProtocolHandledKey"
class ZgpeaceURLProtocol: URLProtocol {override class func canInit(with request: URLRequest) -> Bool { guard let scheme = request.url?.scheme else { return false }
guard scheme == "http" || scheme == "https" else { return false } print("ZgpeaceURLProtocol Request #\(requestCount): URL = \(String(describing: request.url?.absoluteString)): headers = \(String(describing:request.allHTTPHeaderFields))") requestCount += 1 if URLProtocol.property(forKey: protocolKey, in: request) != nil { return false } return false }}
复制代码
注册进 SessionManager
import Foundationimport Alamofire
class ZgpeaceURLSessionDefaultManager: NSObject { let sessionManager: SessionManager static let shared = ZgpeaceURLSessionDefaultManager() private override init() { let configuration = URLSessionConfiguration.default configuration.protocolClasses?.insert(LoggingURLProtocol.self, at: 0) configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders let manager = Alamofire.SessionManager(configuration: configuration) sessionManager = manager } }
复制代码
请求调用
// 自定义拦截后的调用ZgpeaceURLSessionDefaultManager.shared.sessionManager.request(url, method: .get, parameters: requestParameter, headers: requestHeaders).responseData {(response : DataResponse) in }
// 正常Alamofire 调用Alamofire.request(url, method: .get, parameters: requestParameter, headers: requestHeaders).responseData {(response : DataResponse) in }
复制代码
4. Share: 分享一篇有观点和思考的技术文章
大前端技术选型 Native 原生 iOS, Android, React-Native, Flutter, 微信小程序, HTML5
https://blog.csdn.net/zgpeace/article/details/106206896
笔者在世界 500 强企业做了一场 300+人的技术分享,主要内容记录。里面分为三部分,
阿里的架构,淘宝 App 架构,阿里 Flutter 架构,无代码编程。第一个版本的淘宝和 QQ。
大前端技术选型需要考虑的 14 个要素以及优缺点
Demo 部分,初创公司建议用 React-Native 快速开发。
评论