HowTo —— SwiftU2.0 LazyVStack LazyHStack

SwiftUI2.0 提供了 LazyVStack 和 LazyHStack,其作用是只有当 View 在可见区域内才进行渲染,这样可以大大大提高 app 执行效率。由于 VStack 或 HStack 导致的效率问题,在 SwiftUI List (3) —— List、Form、VStack 文章中有简单的比较。

健康笔记是我开发的一个iOS app,主要服务于有长期健康管理需求的人士。可为全家不同成员创建各自的笔记,允许使用者自定义数据类型以记录各种健康数据。

推广

基本用法

struct LazyStack: View {
    var body: some View {
        ScrollView{
            LazyVStack{ //换成 VStack 作比较新数据创建的时机
                ForEach(0...1000,id:\.self){ id in
                    Text(LazyItem(id:id).title)
                }
            }
        }
    }
}

struct LazyItem{
    let id:Int
    let title:String
    init(id:Int){
        self.id = id
        self.title = "id:\(id)"
        print("init new object:\(id)") 
    }
}

使用 Lazy 特性创建不间断的列表显示

import SwiftUI

struct LazyStack: View {
    @State var list = (0...40).map{_ in Item(number:Int.random(in: 1000...5000))}
    @State var loading = false
    var body: some View {
        VStack{
        Text("count:\(list.count)")
        //数据数量,在 LazyVStack 下数据在每次刷新后才会增加,在 VStack 下,数据会一直增加。
        ScrollView{
            LazyVStack{ //换成 VStack 作比较
                ForEach(list,id:\.id){ item in
                    Text("id:\(item.number)")
                        .onAppear {
                            moreItem(id: item.id)
                        }
                }
            }
            if loading {
                ProgressView()
            }
        }
    }
    
    func moreItem(id:UUID){
       //如果是最后一个数据则获取新数据
        if id == list.last!.id && loading != true {
            loading = true
            //增加延时,模拟异步数据获取效果
            DispatchQueue.main.asyncAfter(deadline: .now() + 1){
                //数据模拟,也可获取网络数据
                list.append(contentsOf: (0...30)
                            .map{_ in Item(number:Int.random(in: 1000...5000))})
                loading = false
            }
        }
        
    }
}

 struct Item:Identifiable{
    let id = UUID()
    let number:Int
}

LazyHStack 的用法同 LazyVStack 一样

本博客所有文章除特别声明外,均采用CC 4.0许可协议。转载请注明出处和作者。

关注微信公共号肘子的Swift记事本或在推特上关注@fatbobman,永远不会错过新内容! 您的支持和鼓励将为我的博客写作增添更多的动力! 如果您或身边的朋友有健康数据管理的需求,请使用我开发的app【健康笔记】,正是因为它我才创建了这个博客。

关注