Lazy

Posted by Genie on April 20, 2021

延时加载或延时初始化是一种在 iOS 中优化方案 OC 中: 保证初始化一次,节省内存分配和运行时耗费时间

1
2
3
4
5
6
7
8
9
- (UILabel *)tipLb {
    if (!_tipLb) {
        _tipLb = [[UILabel alloc] init];
        _tipLb.textAlignment = NSTextAlignmentCenter;
        _tipLb.textColor = [UIColor whiteColor];
        _tipLb.backgroundColor = [UIColor clearColor];
    }
    return _tipLb;
}

swift 中:

1
2
3
4
5
6
7
  private lazy var tipLb: UILabel = {
        let lb = UILabel()
        lb.backgroundColor = UIColor.clear
        lb.textColor = UIColor.white
        lb.textAlignment = NSTextAlignment.center
        return lb
    }()

lazy 也可以配合像 map 或是 filter ,让整个行为变成延时进行,对性能提升会有些帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
let data = 1...3
let result = data.map {
    (i: Int) -> Int in
    print("正在处理 \(i)")
    return i * 2
}

print("准备访问结果")
for i in result {
    print("操作后结果为 \(i)")
}

print("操作完毕")
1
2
3
4
5
6
7
8
// 正在处理 1
// 正在处理 2
// 正在处理 3
// 准备访问结果
// 操作后结果为 2
// 操作后结果为 4
// 操作后结果为 6
// 操作完毕
1
2
3
4
5
6
7
8
9
10
11
12
13
let data = 1...3
let result = data.lazy.map {
    (i: Int) -> Int in
    print("正在处理 \(i)")
    return i * 2
}

print("准备访问结果")
for i in result {
    print("操作后结果为 \(i)")
}

print("操作完毕")
1
2
3
4
5
6
7
8
// 准备访问结果
// 正在处理 1
// 操作后结果为 2
// 正在处理 2
// 操作后结果为 4
// 正在处理 3
// 操作后结果为 6
// 操作完毕

示例项目中

1
2
3
4
5
6
let s = l.lazy.filter { $0.questionNumber ?? 0 > 0 }.sorted { (t1, t2) -> Bool in
                if let t11 = t1.questionNumber, let t22 = t2.questionNumber {
                    return t11 < t22
                }
                return false
            }

当然也可以通过嵌套方法和 通过闭包函数作为参数传入 等同于 ==

1
2
3
4
5
6
7
8
9
10
func test () {
	func sortedQuestion(_ s1: StudentQuestionMetaList, s2: StudentQuestionMetaList) -> Bool {
                if let t11 = s1.questionNumber, let t22 = s2.questionNumber {
                    return t11 < t22
                }
                return false
            }

            let s = l.lazy.filter { $0.questionNumber ?? 0 > 0 }.sorted(by: sortedQuestion)
}

是代码结构清晰