趙化 金小俊
摘 要: 相冊(cè)是當(dāng)前移動(dòng)應(yīng)用中的重要功能模塊,如何快速的加載和展示相冊(cè)圖片對(duì)于用戶體驗(yàn)的提升具有顯著意義。本文提出了一種基于分批加載和取尾排序的相冊(cè)枚舉及排序優(yōu)化方法。當(dāng)用戶相冊(cè)中圖片較多時(shí),枚舉每隔一定數(shù)量的圖片后即拋出排序顯示,由于排序耗時(shí)大于枚舉耗時(shí),在每批排序完成后取最后一批枚舉的圖片再行排序,即取尾排序。實(shí)踐表明采用本文的優(yōu)化方法后,相冊(cè)排序顯示效率提升明顯,具有極大的應(yīng)用價(jià)值。
關(guān)鍵詞: 移動(dòng)應(yīng)用;相冊(cè)排序;優(yōu)化方法
【中圖分類號(hào)】F275.3 ? ? 【文獻(xiàn)標(biāo)識(shí)碼】A ? ? 【文章編號(hào)】1674-3733(2020)07-0210-01
1 引言
隨著生活場(chǎng)景的豐富繁多和手機(jī)相機(jī)功能的不斷升級(jí),移動(dòng)APP中的相冊(cè)模塊使用頻率愈趨廣泛[1]。而隨著相冊(cè)中圖片數(shù)量的增多,特別是在需要對(duì)相冊(cè)中圖片按日期排序的功能場(chǎng)景,如何快速的加載圖片,以及如何提高圖片排序的效率成為了一個(gè)亟需解決和優(yōu)化的問題[2-4]。針對(duì)這個(gè)問題,本文以iOS平臺(tái)為例提出了一種基于分批加載和取尾排序的優(yōu)化方法。
2 相冊(cè)功能模塊
移動(dòng)應(yīng)用中相冊(cè)模塊通常包括按日期排序的Moment以及Albums這兩個(gè)功能。其中Moment功能和系統(tǒng)相冊(cè)類似,根據(jù)圖片的日期信息進(jìn)行排序,之后按照不同日期分類別顯示。
3 Moment功能實(shí)現(xiàn)思路
Moment的一般實(shí)現(xiàn)原理為先遍歷系統(tǒng)的所有相冊(cè),之后獲取每個(gè)相冊(cè)內(nèi)圖片的日期信息,根據(jù)日期進(jìn)行分類和排序,最后把枚舉完的所有數(shù)據(jù)放到界面上來顯示。
加載完數(shù)據(jù)之后,即可創(chuàng)建UICollectionView,設(shè)置dataSource以顯示moment圖片。但是如果相冊(cè)圖片數(shù)量較大,常規(guī)加載方法耗時(shí)會(huì)急劇上升,造成用戶打開相冊(cè)卡頓,白屏甚至是程序凍結(jié)等嚴(yán)重影響用戶體驗(yàn)的情況。
4 優(yōu)化方案
對(duì)于Moment功能,常規(guī)加載邏輯需要遍歷完系統(tǒng)內(nèi)的所有相冊(cè)圖片后再按日期排序后顯示給用戶。因此,優(yōu)化的切入口只能在枚舉和排序這兩部分。本文基于此提出了分批加載和取尾排序的思路來解決大批量圖片下枚舉和排序的性能問題。其思路為如果用戶手機(jī)相冊(cè)內(nèi)圖片數(shù)量較多,不是等所有圖片都枚舉排序完再顯示,而是枚舉每隔一定數(shù)量的圖片(比如50張)后即拋到隊(duì)列(NSOperationQueue)里面按日期分類并排序,排序完成后再顯示給用戶,如此既可以讓用戶感知到圖片動(dòng)態(tài)加載的過程,也使圖片能分批加載,避免性能和內(nèi)存的激增。一般情況下,排序的耗時(shí)會(huì)大于圖片枚舉的耗時(shí),也就是第一批50張圖片排序完成后,前面枚舉拋到隊(duì)列里面等待排序的圖片已經(jīng)有若干批,此時(shí)我們只對(duì)最后一批圖片進(jìn)行排序,即取尾。同時(shí),清空當(dāng)前隊(duì)列,因?yàn)橹虚g批次的數(shù)據(jù)已經(jīng)無排序的意義了,相冊(cè)只取最新批次的圖片進(jìn)行顯示。方案詳細(xì)流程圖如圖1所示:
為了最大程度的減輕動(dòng)態(tài)加載后刷新顯示對(duì)用戶造成的突兀感,在顯示之前需要判斷用戶是否在滑動(dòng)頁面,只有頁面靜止的時(shí)候刷新顯示。但對(duì)于全部圖片枚舉完成后的最后一批數(shù)據(jù)則要暫時(shí)保存?。ǚ駝t最后批次的數(shù)據(jù)會(huì)丟失),待用戶停止滑動(dòng)后再行刷新顯示。
4.1 分批加載
Moment需要按日期分類顯示,最新的顯示在最前面,所以在枚舉相冊(cè)的時(shí)候可以先從最近的相冊(cè)開始(一般用戶拍攝的照片相對(duì)導(dǎo)入的圖片會(huì)早一點(diǎn))。加載到50的倍數(shù)張后就拋到隊(duì)列里面等待排序。一個(gè)相冊(cè)枚舉完后再繼續(xù)遍歷其余的相冊(cè),如此循環(huán),直至所有相冊(cè)遍歷完畢。
4.2 取尾排序
每組批次的圖片都加到一個(gè)串行隊(duì)列里面等待排序,該批次的排序完成之后取當(dāng)前隊(duì)列最后一個(gè)(也就是最新過來的枚舉圖片)繼續(xù)執(zhí)行排序,同時(shí)清空當(dāng)前的隊(duì)列內(nèi)的數(shù)據(jù)。
4.3 圖片顯示邏輯
中間批次按日期分類過的數(shù)據(jù)準(zhǔn)備就緒后,在刷新圖片顯示之前先判斷一下當(dāng)前用戶是否在滑動(dòng)屏幕,如果是非滑動(dòng)狀態(tài)則刷新顯示,否則直接丟棄掉,但是對(duì)于最后一批數(shù)據(jù)需要先存儲(chǔ)著,并在用戶停止滑動(dòng)的回調(diào)函數(shù)內(nèi)進(jìn)行判斷,一旦用戶停止滑動(dòng)了就立即刷新到頁面上顯示。
5 方案展望
將上述優(yōu)化方案應(yīng)用于項(xiàng)目中進(jìn)行測(cè)試,當(dāng)相冊(cè)數(shù)量達(dá)到100個(gè),總圖片數(shù)大于一萬張后,相冊(cè)仍然能夠正常打開并流暢滑動(dòng),表明該方案具有高度的可行性和應(yīng)用價(jià)值。
雖然該方案極大的提高了相冊(cè)加載和排序的性能,但仍然有繼續(xù)改進(jìn)的空間,在此提出一些技術(shù)展望的設(shè)想,以期拋磚引玉之效:
1)枚舉隊(duì)列內(nèi)等待排序的中間數(shù)據(jù)亦可以保留,待用戶停止滑動(dòng)后做差別排序,而不是簡(jiǎn)單的直接丟棄。
2)排序隊(duì)列目前存在著重復(fù)排序。比如,當(dāng)?shù)谝慌?0張圖片排序后,第二批進(jìn)入排序的200張圖片又需要重新分類排序,中間批次的數(shù)據(jù)只是為了展示給用戶一個(gè)動(dòng)態(tài)加載過程,所以第200張圖片可以只對(duì)后面的150張圖片進(jìn)行排序,圖片中有新的日期則新建日期類別,相同日期的直接插入前序中。
參考文獻(xiàn)
[1] 張浩,郭燦.數(shù)據(jù)可視化技術(shù)應(yīng)用趨勢(shì)與分類研究[J].軟件導(dǎo)刊,2012(5):169-172.
[2] 劉洪輝,吳岳芬.用戶行為模式挖掘問題的研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2006(5):49-53.
[3] 李志鵬,李立弘,喻守剛,曾鋒,史俊波.基于iOS的實(shí)時(shí)反饋水準(zhǔn)測(cè)量軟件設(shè)計(jì)與實(shí)現(xiàn)[J].測(cè)繪通報(bào),2019(S2):15-19.
[4] 胡偉峰,仇磊.智能手機(jī)iOS&Android系統(tǒng)操控行為的用戶體驗(yàn)對(duì)比研究[J].包裝過程,2018(16):12-17.