每周完成一个 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 = 6
Output: 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 = 0
let 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 Foundation
import 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 快速开发。
评论