写点什么

John 易筋 ARTS 打卡 Week 01

用户头像
John(易筋)
关注
发布于: 2020 年 05 月 24 日

每周完成一个 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+人的技术分享,主要内容记录。里面分为三部分,

  1. 阿里的架构,淘宝 App 架构,阿里 Flutter 架构,无代码编程。第一个版本的淘宝和 QQ。

  2. 大前端技术选型需要考虑的 14 个要素以及优缺点

  3. Demo 部分,初创公司建议用 React-Native 快速开发。


用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

工作10+年,架构师,曾经阿里巴巴资深无线开发,汇丰银行架构师/专家。擅长架构、算法、数据结构、设计模式、iOS、Java Spring Boot。易筋为阿里巴巴花名。

评论

发布
暂无评论
John 易筋 ARTS打卡Week 01