【潮汐】鴻蒙ArkUI中的LazyForEach和SwiftUI中的ForEach有什么區(qū)別

鴻蒙HarmonyOS開發(fā)ArkUI中的LazyForEach和SwiftUI中的ForEach的區(qū)別

SwiftUI 提供了三種不同的機(jī)制來構(gòu)建一棵樹的動態(tài)部分着撩,F(xiàn)orEach就是其中之一枫浙。
ArkUI是鴻蒙的核心UI布局框架我磁,除了ForEach,它還提供了LazyForEach厌衔,便于高性能開發(fā)璧帝。

image.png

由于ForEach往往和List搭配使用,我們會關(guān)注ForEach里的view是不是懶加載的富寿,在SwiftUI中睬隶,只有ForEach,沒有公開資料描述ForEach加載方式页徐,在WWDC20-10031的材料中提到過:List里的內(nèi)容總是以懶加載方式存在的苏潜。

然而測試發(fā)現(xiàn),當(dāng)list里的數(shù)據(jù)到達(dá)100000條后变勇,初始化CPU占有率會達(dá)到100%恤左,此時(shí)頁面雖然顯示了,但是無法滑動搀绣,即無響應(yīng)狀態(tài)飞袋。

List {
    ForEach(0..<100000){ I in
        ChatView(id: i)
    }
}

why is the swiftUI list not lazy (compared to lazyVStack)?
Bad performance of large SwiftUI lists on macOS

一種優(yōu)化方式是給 List 里的內(nèi)容加上固定高度,這樣使用ForEach時(shí)SwiftUI就不需要計(jì)算每一個(gè)內(nèi)容的高度了链患。

List {
    ForEach(0..<100000){ I in
        ChatView(id: i)
            .frame(width: 500, height: 15, alignment: .leading)
    }
}

此外授嘀,SwiftUI提供了LazyVStack和LazyHStack這兩個(gè)容器,放在這兩個(gè)容器中的內(nèi)容是懶加載的锣险。

相比SwiftUI,ArkUI中的LazyForEach無法實(shí)現(xiàn)以下場景:

1览闰、SwiftUI中芯肤,可以使用ForEach直接遍歷,可以通過$0獲取索引压鉴。

VStack() {
    // 遍歷從1-10崖咨,并創(chuàng)建從1-10的文本組件
    ForEach((1...10), id: \.self) {
        Text("\($0)…")
    }
}

2、可以直接對數(shù)組進(jìn)行forEach油吭,進(jìn)行遍歷:

let name = ["a","b","c","d"]

name.forEach {
    switch $0 {
    // 對name進(jìn)行遍歷击蹲,找到a
    case let x where x.hasPrefix("a"):
        print("\(x) is here")
    default:
        print("hi, \($0)")
    }
}
SwiftUI和ArkUI中的LazyForEach使用差異如下:

1、自由控制遍歷的次數(shù)

在SwiftUI中婉宰,比如用數(shù)組的前一半數(shù)據(jù)繪制Text:

ForEach(0..<foo.count/2) { index in
    Text(foo[index])
}

在ArkUI中歌豺,以下代碼報(bào)錯:Argument of type ‘boolean’ is not assignable to parameter of type ‘a(chǎn)ny[]’.

ForEach(0..<foo.count/2,
  (item, index) => {
    ListItem() {
      Stack50View()
    }
  },
  (item) => item.toString()
)

2、List和ForEach搭配使用靈活性

在SwiftUI中心包,List中可以提供多個(gè)數(shù)據(jù)源和ForEach組合类咧,比如在List中添加一組ForEach,添加一個(gè)Text后再添加一組ForEach:

List{
  ForEach(items,id:\.self){ item in
    Text(item)
  }
  Text("其他內(nèi)容")
  ForEach(0..<10){ I in
    Text("id:\(i)")
  }
}

在ArkUI中,List中只能添加ListItem痕惋,以下代碼報(bào)錯:The ‘List’ component can have only the ListItem, Section and ListItemGroup child component.

List() {
  Text()
  ForEach(this.arr,
    (item, index) => {
      ListItem() {
        Stack50View()
      }
    },
    (item) => item.toString()
  )
  ForEach(this.arr,
    (item, index) => {
      ListItem() {
        Stack50View()
      }
    },
    (item) => item.toString()
  )
}

其他

SwiftUI中 ForEach內(nèi)對數(shù)據(jù)增区宇、刪、改值戳、查不需要通知框架層议谷。
ArkUI中的LazyForEach需要告知框架層。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末堕虹,一起剝皮案震驚了整個(gè)濱河市卧晓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲫凶,老刑警劉巖禀崖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異螟炫,居然都是意外死亡波附,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門昼钻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掸屡,“玉大人,你說我怎么就攤上這事然评〗霾疲” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵碗淌,是天一觀的道長盏求。 經(jīng)常有香客問我,道長亿眠,這世上最難降的妖魔是什么碎罚? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮纳像,結(jié)果婚禮上荆烈,老公的妹妹穿的比我還像新娘。我一直安慰自己竟趾,他們只是感情好憔购,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著岔帽,像睡著了一般玫鸟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上犀勒,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天鞋邑,我揣著相機(jī)與錄音诵次,去河邊找鬼。 笑死枚碗,一個(gè)胖子當(dāng)著我的面吹牛逾一,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肮雨,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼遵堵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怨规?” 一聲冷哼從身側(cè)響起陌宿,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎波丰,沒想到半個(gè)月后壳坪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掰烟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年爽蝴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纫骑。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝎亚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出先馆,到底是詐尸還是另有隱情发框,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布煤墙,位于F島的核電站梅惯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仿野。R本人自食惡果不足惜个唧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望设预。 院中可真熱鬧,春花似錦犁河、人聲如沸鳖枕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宾符。三九已至,卻和暖如春灭翔,著一層夾襖步出監(jiān)牢的瞬間魏烫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哄褒,地道東北人稀蟋。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像呐赡,于是被迫代替她去往敵國和親退客。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容