John 易筋 ARTS打卡Week 01

发布于: 13 小时前

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

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

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

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

发布于: 13 小时前 阅读数: 54
用户头像

John(易筋)

关注

还未添加个人签名 2018.07.17 加入

还未添加个人简介

评论

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