久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

【成都網(wǎng)站建設(shè)】預(yù)加載與智能預(yù)加載(iOS)-成都創(chuàng)新互聯(lián)官方網(wǎng)站

2023-01-01    分類: 網(wǎng)站建設(shè)

前兩次的分享分別介紹了 ASDK 對于渲染的優(yōu)化以及 ASDK 中使用的另一種布局模型;這兩個新機制的引入分別解決了 iOS 在主線程渲染視圖以及 Auto Layout 的性能問題,而這一次討論的主要內(nèi)容是 ASDK 如何預(yù)先請求服務(wù)器數(shù)據(jù),達(dá)到看似無限滾動列表的效果的。

這篇文章是 ASDK 系列中的最后一篇,文章會介紹 iOS 中幾種預(yù)加載的方案,以及 ASDK 中是如何處理預(yù)加載的。

不過,在介紹 ASDK 中實現(xiàn)智能預(yù)加載的方式之前,文章中會介紹幾種簡單的預(yù)加載方式,方便各位開發(fā)者進行對比,選擇合適的機制實現(xiàn)預(yù)加載這一功能。

網(wǎng)絡(luò)與性能

ASDK 通過在渲染視圖和布局方面的優(yōu)化已經(jīng)可以使應(yīng)用在任何用戶的瘋狂操作下都能保持 60 FPS 的流暢程度,也就是說,我們已經(jīng)充分的利用了當(dāng)前設(shè)備的性能,調(diào)動各種資源加快視圖的渲染。

但是,僅僅在 CPU 以及 GPU 方面的優(yōu)化往往是遠(yuǎn)遠(yuǎn)不夠的。在目前的軟件開發(fā)中,很難找到一個沒有任何網(wǎng)絡(luò)請求的應(yīng)用,哪怕是一個記賬軟件也需要服務(wù)器來同步保存用戶的信息,防止資料的丟失;所以,只在渲染這一層面進行優(yōu)化還不能讓用戶的體驗達(dá)到好,因為網(wǎng)絡(luò)請求往往是一個應(yīng)用最為耗時以及昂貴的操作。

每一個應(yīng)用程序在運行時都可以看做是 CPU 在底層利用各種資源瘋狂做加減法運算,其中最耗時的操作并不是進行加減法的過程,而是資源轉(zhuǎn)移的過程。

舉一個不是很恰當(dāng)?shù)睦樱鲝N(CPU)在炒一道菜(計算)時往往需要的時間并不多,但是菜的采購以及準(zhǔn)備(資源的轉(zhuǎn)移)會占用大量的時間,如果在每次炒菜之前,都由幫廚提前準(zhǔn)備好所有的食材(緩存),那么做一道菜的時間就大大減少了。

而提高資源轉(zhuǎn)移的效率的好辦法就是使用多級緩存:

從上到下,雖然容量越來越大,直到 Network 層包含了整個互聯(lián)網(wǎng)的內(nèi)容,但是訪問時間也是直線上升;在 Core 或者三級緩存中的資源可能訪問只需要幾個或者幾十個時鐘周期,但是網(wǎng)絡(luò)中的資源就遠(yuǎn)遠(yuǎn)大于這個數(shù)字,幾分鐘、幾小時都是有可能的。

更糟糕的是,因為天朝的網(wǎng)絡(luò)情況及其復(fù)雜,運營商劫持 DNS、404 無法訪問等問題導(dǎo)致網(wǎng)絡(luò)問題極其嚴(yán)重;而如何加速網(wǎng)絡(luò)請求成為了很多移動端以及 Web 應(yīng)用的重要問題。

預(yù)加載

本文就會提供一種緩解網(wǎng)絡(luò)請求緩慢導(dǎo)致用戶體驗較差解決方案,也就是預(yù)加載;在本地真正需要渲染界面之前就通過網(wǎng)絡(luò)請求獲取資源存入內(nèi)存或磁盤。

預(yù)加載并不能徹底解決網(wǎng)絡(luò)請求緩慢的問題,而是通過提前發(fā)起網(wǎng)絡(luò)請求緩解這一問題。

那么,預(yù)加載到底要關(guān)注哪些方面的問題呢?總結(jié)下來,有以下兩個關(guān)注點:

需要預(yù)加載的資源 預(yù)加載發(fā)出的時間

文章會根據(jù)上面的兩個關(guān)注點,分別分析四種預(yù)加載方式的實現(xiàn)原理以及優(yōu)缺點:

無限滾動列表 threshold 惰性加載 智能預(yù)加載 無限滾動列表

其實,無限滾動列表并不能算是一種預(yù)加載的實現(xiàn)原理,它只是提供一種分頁顯示的方法,在每次滾動到UITableView底部時,才會開始發(fā)起網(wǎng)絡(luò)請求向服務(wù)器獲取對應(yīng)的資源。

雖然這種方法并不是預(yù)加載方式的一種,放在這里的主要作用是作為對比方案,看看如果不使用預(yù)加載的機制,用戶體驗是什么樣的。

很多客戶端都使用了分頁的加載方式,并沒有添加額外的預(yù)加載的機制來提升用戶體驗,雖然這種方式并不是不能接受,不過每次滑動到視圖底部之后,總要等待網(wǎng)絡(luò)請求的完成確實對視圖的流暢性有一定影響。

雖然僅僅使用無限滾動列表而不提供預(yù)加載機制會在一定程度上影響用戶體驗,不過,這種需要用戶等待幾秒鐘的方式,在某些時候確實非常好用,比如:投放廣告。

QQ 空間就是這么做的,它們投放的廣告基本都是在整個列表的最底端,這樣,當(dāng)你滾動到列表最下面的時候,就能看到你急需的租房、租車、同城交友、信用卡辦理、只有 iPhone 能玩的游戲以及各種奇奇怪怪的辣雞廣告了,很好的解決了我們的日常生活中的各種需求。

Threshold

使用 Threshold 進行預(yù)加載是一種最為常見的預(yù)加載方式,知乎客戶端就使用了這種方式預(yù)加載條目,而其原理也非常簡單,根據(jù)當(dāng)前UITableView的所在位置,除以目前整個UITableView.contentView的高度,來判斷當(dāng)前是否需要發(fā)起網(wǎng)絡(luò)請求:

let threshold: CGFloat = 0.7 var currentPage = 0 override func scrollViewDidScroll(_ scrollView: UIScrollView) { let current = scrollView.contentOffset.y + scrollView.frame.size.height let total = scrollView.contentSize.height let ratio = current / total if ratio >= threshold { currentPage += 1 print("Request page \(currentPage) from server.") }}

上面的代碼在當(dāng)前頁面已經(jīng)劃過了 70% 的時候,就請求新的資源,加載數(shù)據(jù);但是,僅僅使用這種方法會有另一個問題,尤其是當(dāng)列表變得很長時,十分明顯,比如說:用戶從上向下滑動,總共加載了 5 頁數(shù)據(jù):

| Page | Total | Threshold | Diff | | :-: | :-: | :-: | :-: | | 1 | 10 | 7 | 7 | | 2 | 20 | 14 | 4 | | 3 | 30 | 21 | 1 | | 4 | 40 | 28 | -2 | | 5 | 50 | 35 | -5 |

Page 當(dāng)前總頁數(shù); Total 當(dāng)前UITableView總元素個數(shù); Threshold 網(wǎng)絡(luò)請求觸發(fā)時間; Diff 表示最新加載的頁面被瀏覽了多少;

當(dāng) Threshold 設(shè)置為 70% 的時候,其實并不是單頁 70%,這就會導(dǎo)致新加載的頁面都沒有看,應(yīng)用就會發(fā)出另一次請求,獲取新的資源。

動態(tài)的 Threshold

解決這個問題的辦法,還是比較簡單的,通過修改上面的代碼,將 Threshold 變成一個動態(tài)的值,隨著頁數(shù)的增長而增長:

let threshold: CGFloat = 0.7 let itemPerPage: CGFloat = 10 var currentPage: CGFloat = 0 override func scrollViewDidScroll(_ scrollView: UIScrollView) { let current = scrollView.contentOffset.y + scrollView.frame.size.height let total = scrollView.contentSize.height let ratio = current / total let needRead = itemPerPage * threshold + currentPage * itemPerPage let totalItem = itemPerPage * (currentPage + 1) let newThreshold = needRead / totalItem if ratio >= newThreshold { currentPage += 1 print("Request page \(currentPage) from server.") }}

通過這種方法獲取的newThreshold就會隨著頁數(shù)的增長而動態(tài)的改變,解決了上面出現(xiàn)的問題:

惰性加載

使用 Threshold 進行預(yù)加載其實已經(jīng)適用于大多數(shù)應(yīng)用場景了;但是,下面介紹的方式,惰性加載能夠有針對性的加載用戶“會看到的” Cell。

惰性加載,就是在用戶滾動的時候會對用戶滾動結(jié)束的區(qū)域進行計算,只加載目標(biāo)區(qū)域中的資源。

用戶在飛速滾動中會看到巨多的空白條目,因為用戶并不想閱讀這些條目,所以,我們并不需要真正去加載這些內(nèi)容,只需要在ASTableView/ASCollectionView中只根據(jù)用戶滾動的目標(biāo)區(qū)域惰性加載資源。

惰性加載的方式不僅僅減少了網(wǎng)絡(luò)請求的冗余資源,同時也減少了渲染視圖、數(shù)據(jù)綁定的耗時。

計算用戶滾動的目標(biāo)區(qū)域可以直接使用下面的代理方法獲取:

let markedView = UIView() let rowHeight: CGFloat = 44.0 override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { let targetOffset = targetContentOffset.pointee let targetRect = CGRect(origin: targetOffset, size: scrollView.frame.size) markedView.frame = targetRect markedView.backgroundColor = UIColor.black.withAlphaComponent(0.1) tableView.addSubview(markedView) var indexPaths: [IndexPath] = [] let startIndex = Int(targetRect.origin.y / rowHeight) let endIndex = Int((targetRect.origin.y + tableView.frame.height) / rowHeight) for index in startIndex...endIndex { indexPaths.append(IndexPath(row: index, section: 0)) } print("\(targetRect) \(indexPaths)")}

以上代碼只會大致計算出目標(biāo)區(qū)域內(nèi)的IndexPath數(shù)組,并不會展開新的 page,同時會使用淺黑色標(biāo)記目標(biāo)區(qū)域。

當(dāng)然,惰性加載的實現(xiàn)也并不只是這么簡單,不僅需要客戶端的工作,同時因為需要加載特定 offset 資源,也需要服務(wù)端提供相應(yīng) API 的支持。

雖然惰性加載的方式能夠按照用戶的需要請求對應(yīng)的資源,但是,在用戶滑動UITableView的過程中會看到大量的空白條目,這樣的用戶體驗是否可以接受又是值得考慮的問題了。

智能預(yù)加載

終于到了智能預(yù)加載的部分了,當(dāng)我第一次得知 ASDK 可以通過滾動的方向預(yù)加載不同數(shù)量的內(nèi)容,感覺是非常神奇的。

如上圖所示 ASDK 把正在滾動的ASTableView/ASCollectionView劃分為三種狀態(tài):

Fetch Data Display Visible

上面的這三種狀態(tài)都是由 ASDK 來管理的,而每一個ASCellNode的狀態(tài)都是由ASRangeController控制,所有的狀態(tài)都對應(yīng)一個ASInterfaceState:

ASInterfaceStatePreload當(dāng)前元素貌似要顯示到屏幕上,需要從磁盤或者網(wǎng)絡(luò)請求數(shù)據(jù); ASInterfaceStateDisplay當(dāng)前元素非常可能要變成可見的,需要進行異步繪制; ASInterfaceStateVisible當(dāng)前元素最少在屏幕上顯示了 1px

當(dāng)用戶滾動當(dāng)前視圖時,ASRangeController就會修改不同區(qū)域內(nèi)元素的狀態(tài):

上圖是用戶在向下滑動時,ASCellNode是如何被標(biāo)記的,假設(shè)當(dāng)前視圖可見的范圍高度為 1,那么在默認(rèn)情況下,五個區(qū)域會按照上圖的形式進行劃分:

| Buffer | Size | | :-: | :-: | | Fetch Data Leading Buffer | 2 | | Display Leading Buffer | 1 | | Visible | 1 | | Display Trailing Buffer | 1 | | Fetch Data Trailing Buffer | 1 |

在滾動方向(Leading)上 Fetch Data 區(qū)域會是非滾動方向(Trailing)的兩倍,ASDK 會根據(jù)滾動方向的變化實時改變緩沖區(qū)的位置;在向下滾動時,下面的 Fetch Data 區(qū)域就是上面的兩倍,向上滾動時,上面的 Fetch Data 區(qū)域就是下面的兩倍。

這里的兩倍并不是一個確定的數(shù)值,ASDK 會根據(jù)當(dāng)前設(shè)備的不同狀態(tài),改變不同區(qū)域的大小,但是滾動方向的區(qū)域總會比非滾動方向大一些

智能預(yù)加載能夠根據(jù)當(dāng)前的滾動方向,自動改變當(dāng)前的工作區(qū)域,選擇合適的區(qū)域提前觸發(fā)請求資源、渲染視圖以及異步布局等操作,讓視圖的滾動達(dá)到真正的流暢。

原理

在 ASDK 中整個智能預(yù)加載的概念是由三個部分來統(tǒng)一協(xié)調(diào)管理的:

ASRangeController ASDataController ASTableView與ASTableNode

對智能預(yù)加載實現(xiàn)的分析,也是根據(jù)這三個部分來介紹的。

工作區(qū)域的管理

ASRangeController是ASTableView以及ASCollectionView內(nèi)部使用的控制器,主要用于監(jiān)控視圖的可見區(qū)域、維護工作區(qū)域、觸發(fā)網(wǎng)絡(luò)請求以及繪制、單元格的異步布局。

以ASTableView為例,在視圖進行滾動時,會觸發(fā)-[UIScrollView scrollViewDidScroll:]代理方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { ASInterfaceState interfaceState = [self interfaceStateForRangeController:_rangeController]; if (ASInterfaceStateIncludesVisible(interfaceState)) { [_rangeController updateCurrentRangeWithMode:ASLayoutRangeModeFull]; } ...}

每一個ASTableView的實例都持有一個ASRangeController以及ASDataController用于管理工作區(qū)域以及數(shù)據(jù)更新。

ASRangeController 最重要的私有方法-[ASRangeController _updateVisibleNodeIndexPaths]一般都是因為上面的方法間接調(diào)用的:

-[ASRangeController updateCurrentRangeWithMode:] -[ASRangeController setNeedsUpdate] -[ASRangeController updateIfNeeded] -[ASRangeController _updateVisibleNodeIndexPaths]

調(diào)用棧中間的過程其實并不重要,最后的私有方法的主要工作就是計算不同區(qū)域內(nèi) Cell 的NSIndexPath數(shù)組,然后更新對應(yīng) Cell 的狀態(tài)ASInterfaceState觸發(fā)對應(yīng)的操作。

我們將這個私有方法的實現(xiàn)分開來看:

- (void)_updateVisibleNodeIndexPaths { NSArray<NSArray *> *allNodes = [_dataSource completedNodes];

分享名稱:【成都網(wǎng)站建設(shè)】預(yù)加載與智能預(yù)加載(iOS)-成都創(chuàng)新互聯(lián)官方網(wǎng)站
轉(zhuǎn)載來源:http://www.js-pz168.com/news20/227320.html

網(wǎng)站建設(shè)、網(wǎng)絡(luò)推廣公司-創(chuàng)新互聯(lián),是專注品牌與效果的網(wǎng)站制作,網(wǎng)絡(luò)營銷seo公司;服務(wù)項目有網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
欧美午夜一区二区三区| 精品捆绑美女sm三区| www久久精品| 亚洲九九爱视频| 久久www免费人成看片高清| 91在线小视频| 亚洲永久一区二区三区在线| 欧美一区二区三区白人| 《视频一区视频二区| 久久不见久久见免费视频1| 91超碰rencao97精品| 亚洲欧美日产图| 2023国产精品自拍| 视频在线观看一区| 91老师国产黑色丝袜在线| 亚洲国产一区二区精品视频| 精品伦理精品一区| 性做久久久久久| 99精品视频一区| 色婷婷一区二区| 亚洲国产精品成人综合色在线婷婷| 日韩不卡在线观看日韩不卡视频| hitomi一区二区三区精品| 亚洲免费精品视频| 国产亚洲成aⅴ人片在线观看| 日韩精品每日更新| 高清免费日韩| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 欧美国产一区二区| 精品一区二区三区免费视频| 久久久久久99| 欧美mv日韩mv| 日本不卡一区二区三区 | 99re视频这里只有精品| 亚洲一区二区在线免费观看| 久久九九99视频| 久久精品国产**网站演员| 激情五月综合色婷婷一区二区| 欧美精选一区二区| 亚洲国产日产av| www.久久久| 欧美精品在线观看播放| 亚洲一区二区三区中文字幕在线| 成人av动漫网站| 在线观看日产精品| 亚洲欧美国产高清| 91精品国产一区二区三区动漫| 欧美亚洲愉拍一区二区| 亚洲免费av在线| 91蝌蚪porny| 欧美久久久久免费| 婷婷丁香激情综合| 久久99导航| 久久久国产午夜精品| 国产一区亚洲一区| 亚洲蜜桃av| 亚洲色图欧美在线| 91久久爱成人| 日韩一区二区三区在线| 蜜桃av噜噜一区| 秋霞久久久久久一区二区| 国产日产欧美一区二区视频| 国产精品99久久久久久宅男| 色综合久久久久久久久| 亚洲欧美日韩在线不卡| av蓝导航精品导航| 欧美v国产在线一区二区三区| 老鸭窝一区二区久久精品| 亚洲精品9999| 亚洲蜜桃精久久久久久久| 99精品欧美一区二区三区| 日韩三级在线免费观看| 久久不见久久见免费视频7| 亚洲图片欧洲图片日韩av| 亚洲欧美日韩久久| 国产精品久久久久久久久久直播 | 亚洲免费av高清| 国产伦视频一区二区三区| 精品成人一区二区三区四区| 国产一区二区美女诱惑| 色婷婷亚洲婷婷| 天天操天天综合网| 五月天亚洲综合小说网| 亚洲精品乱码久久久久久日本蜜臀| 国产精品免费观看高清| 国产欧美精品在线观看| 97se亚洲国产综合在线| 精品国产一区二区三区av性色| 国产在线播放一区三区四| 欧美午夜电影在线播放| 另类欧美日韩国产在线| 在线精品视频一区二区| 日韩国产精品久久| 夜夜爽99久久国产综合精品女不卡 | 欧美午夜视频网站| 蜜桃久久久久久久| 欧洲在线/亚洲| 蜜臀av一区二区在线免费观看| 在线视频一区观看| 日韩精品午夜视频| 日本久久精品电影| 秋霞国产午夜精品免费视频| 色婷婷久久久亚洲一区二区三区 | www.欧美日韩国产在线| 欧美成人伊人久久综合网| 国产91丝袜在线18| 日韩精品在线一区二区| 99免费精品视频| 久久久国产午夜精品| 波多野结衣成人在线| 国产精品国产自产拍在线| 精品不卡在线| 亚洲精品国产第一综合99久久| 欧美亚洲另类在线一区二区三区 | 精品伊人久久久久7777人| 欧美日韩中文精品| 国产一区二区三区av电影| 欧美一级生活片| 成人精品高清在线| 国产亚洲精品资源在线26u| 国产高清在线一区二区| 亚洲日本va在线观看| 午夜欧美一区二区三区免费观看| 日日夜夜免费精品视频| 在线视频亚洲一区| 国产精品一二二区| 精品国产免费一区二区三区香蕉| 5g国产欧美日韩视频| 国产精品三级av在线播放| 久久久综合香蕉尹人综合网| 亚洲综合丁香婷婷六月香| 色噜噜狠狠成人网p站| 国内精品视频一区二区三区八戒 | 国产激情一区二区三区四区| 精品国产凹凸成av人导航| 成人xxxxx色| 亚洲精品国产高清久久伦理二区| 午夜视频久久久| 久久国产生活片100| 日韩一级片在线观看| 91久久久一线二线三线品牌| 亚洲天堂久久久久久久| 亚洲日本一区二区三区在线不卡| 老鸭窝一区二区久久精品| 日韩女同互慰一区二区| 国产精品白丝jk白祙| 一区二区理论电影在线观看| 91高清在线观看| 粉嫩高潮美女一区二区三区| 欧美国产精品中文字幕| 日韩一本精品| 国内精品久久久久影院薰衣草| 久久综合精品国产一区二区三区| 久久久久se| 免费精品99久久国产综合精品| 日韩一区二区视频| 九9re精品视频在线观看re6| 天堂在线亚洲视频| 日韩欧美高清dvd碟片| 精品国产乱码久久久久久108| 三级欧美在线一区| 日韩精品一区二区三区在线播放| 精品日韩电影| 蜜桃精品在线观看| 久久久久国色av免费看影院| 日本一区二区高清视频| 国产真实乱偷精品视频免| 国产欧美日韩中文久久| 在线不卡视频一区二区| 成人av午夜影院| 亚洲综合成人在线视频| 91精品国产色综合久久| 国精产品一区二区| 蜜桃av一区二区| 国产女主播一区| 色美美综合视频| 91精品久久香蕉国产线看观看| 午夜久久久久久| 精品成人一区二区| 亚洲视频电影| 99热这里都是精品| 午夜精品一区二区三区电影天堂| 日韩视频一区二区| 特级西西444www大精品视频| 国产凹凸在线观看一区二区| 亚洲精品大片www| 日韩三级精品电影久久久| 欧美午夜精品久久久久免费视| 国产精品一线二线三线| 亚洲另类色综合网站| 91精品福利在线一区二区三区 | 日韩欧美在线一区二区三区| 日韩精品欧美一区二区三区| 成人激情动漫在线观看| 亚洲18女电影在线观看| 久久精品一级爱片| 欧美网站大全在线观看| 亚洲欧美日韩国产手机在线| 91麻豆精品国产91久久久资源速度| 久久综合伊人77777麻豆|