青青草狠狠操-青青国产成人久久91-青青国产成人久久91网-青青热久久久久综合精品-青娱乐伊人

音樂小程序開發(fā)名字(音樂小程序研究意義)

副標(biāo)題
2023-06-15 18:42:06 作者:網(wǎng)絡(luò)來源:網(wǎng)絡(luò)

  原文音樂小程序開發(fā)名字:http://www.jianshu.com/p/4ef3d3737661?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

  作者:故胤道長

  在 iOS 開發(fā)中,寫一個(gè) App 很容易,但是要寫好一個(gè) App,確是要下另一番功夫。首先,我們來看一個(gè) App 的開發(fā)要求:

  寫一個(gè) App,顯示出 Spotify 上 Lady Gaga 相關(guān)的所有音樂專輯,相關(guān)信息可以通過以下網(wǎng)址查到:

  https://api.spotify.com/v1/search?q=lady+gaga&type=album

需求分析

  首先拿到開發(fā)要求,最重要的是明確開發(fā)細(xì)節(jié)。這里面有很多我們不清楚的地方需要與產(chǎn)品經(jīng)理和設(shè)計(jì)師交流:顯示是要用 TableView 還是 CollectionView?每個(gè)音樂專輯的哪些信息需要顯示?如果專輯數(shù)量過多,我們優(yōu)先顯示哪些專輯?這個(gè) App 除音樂小程序開發(fā)名字了顯示信息以外,還需要哪些拓展功能?這個(gè)產(chǎn)品的大小是否有要求?需要多少天完成?

  經(jīng)過討論之后,大家的一致意見是做個(gè)如下的 App:

  LadyGaga

  于是我們就清楚了,是要做一個(gè) tableView,每個(gè) Cell 對應(yīng)一個(gè)專輯信息,左邊是圖片,右邊是專輯名。點(diǎn)擊 Cell,可以看到相應(yīng)的專輯大圖。

  構(gòu)建架構(gòu)

  首先這個(gè) App 比較簡單,我們只要用最基本的 MVC就可做好。

Model 部分:

  只需要一個(gè) Model, 為 Album,對應(yīng)每一個(gè)專輯的信息;

View 部分:

  主體的部分可以在 Storyboard 里面完成;

  最好單獨(dú)新建一個(gè) UITableViewCell 的子類,用來對應(yīng)設(shè)置專輯的UI;

ViewController 部分:

  其中一個(gè) ViewController 為 TableViewController,負(fù)責(zé)現(xiàn)實(shí)所有專輯的信息;

  另一個(gè) ViewController 負(fù)責(zé)展示 detail info,比如專輯的大圖;

Network 部分:

  負(fù)責(zé)從網(wǎng)絡(luò)上 fetch 專輯信息;以及根據(jù)專輯的圖片網(wǎng)址,fetch 圖片數(shù)據(jù);

  基本架構(gòu)

  細(xì)節(jié)實(shí)現(xiàn)

Network 部分:

  fetchAlbums 和 downloadImage 都用Apple 自帶的 URLSession 和 JSONserialization 就可以實(shí)現(xiàn),或者也可以用優(yōu)秀的第三方庫 AlamoFire。因?yàn)檫@個(gè) App 比較簡單,AlamoFire 優(yōu)勢不明顯,且引入第三方庫會增加 App 的體積,故而推薦使用前者?;旧暇褪菍?shí)現(xiàn)下面兩個(gè)函數(shù):

  funcfetchAlbums(with url: String, completion : @escaping (_ albums: [Album]?, _ error : NSError?) -> Void) funcdownloadImage(_ url: String) -> UIImage?

  對于第一個(gè)函數(shù) fetchAlbums,因?yàn)榫W(wǎng)絡(luò)請求是耗時(shí)耗力的工作,我們一般會將它們用后臺線程而非主線程(UI線程)來處理,這樣可以保持UI的流暢運(yùn)行。用閉包則是為了異步多線程完成后可以回調(diào),同時(shí) error 是為了監(jiān)視網(wǎng)絡(luò)請求是否出錯(cuò)。

  對于第二個(gè)函數(shù) downloadImage,最簡單的方法是通過 url 拿到對應(yīng)的 data,然后通過相應(yīng)的 data 拿到 image。返回為 optional 的原因是有可能 URL 有問題或者網(wǎng)絡(luò)請求出錯(cuò),此時(shí)返回 nil。

  從API設(shè)計(jì)的角度來說,以上的downloadImage并不是最佳設(shè)計(jì)。最佳的設(shè)計(jì)是我們能知道哪里出錯(cuò)了,比如下面這樣:

  enumDownloadImageError: Error{ caseInvalidURLcaseInvalidData}funcdownloadImage(_ url: String)throws -> UIImage { guardlet aUrl = URL(string: url) else { throwDownloadImageError.InvalidURL } do { let data = tryData(contentsOf: aUrl) iflet image = UIImage(data: data) { return image } else { throwDownloadImageError.InvalidData } } catch { throwDownloadImageError.InvalidURL } }

音樂小程序開發(fā)名字(音樂小程序研究意義)

ViewController 部分:

  對于 AlbumsController,我們用到了代理模式(Delegate),即將 tableView 代理到了 AlbumsController 上。我們只要實(shí)現(xiàn)相應(yīng)的 dataSource 和 delegate 方法即可。其中對于 dataSource 而言,有兩個(gè)方法是必須實(shí)現(xiàn)的,它們是:

  functableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> IntfunctableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

  同時(shí),AlbumsController 里面,還有兩個(gè)數(shù)組,一個(gè)用來裝專輯([Album]),一個(gè)用來裝圖片([UIImage?]),這樣我們只需下載數(shù)據(jù)一次,并將其存入相應(yīng)數(shù)組,之后就無需再次進(jìn)行相關(guān)的網(wǎng)絡(luò)請求了。也就是說,這兩個(gè)數(shù)組起到了緩存的作用。

  具體的實(shí)現(xiàn)是:首先在 viewDidLoad() 中請求服務(wù)器取出相應(yīng)的數(shù)據(jù)。之后根據(jù)專輯數(shù)量設(shè)定 TableView 的相應(yīng)行數(shù)。在具體的一行當(dāng)中,我們可以根據(jù) indexPath 確定相應(yīng)的專輯。根據(jù)相應(yīng)專輯的圖片 URL ,我們可以拿到相應(yīng)的圖片,之后緩存進(jìn)圖片數(shù)組。由于我們復(fù)用了 TableView 的 Cell,所以如果不緩存圖片而每次去進(jìn)行網(wǎng)絡(luò)請求,會因?yàn)檠訒r(shí)很嚴(yán)重而會造成圖片閃爍的后果。

  最后兩個(gè) ViewController 之間的跳轉(zhuǎn)可以用 navigationController 來實(shí)現(xiàn)。

View 部分:

  自定義 AlbumCell 可以保證 App 的擴(kuò)展性很好。同時(shí),為了處理有些專輯名字過長 Label 顯示不了的問題,可以用autoshrink 來處理。

  App 運(yùn)行流程

  優(yōu)化拓展

  上面的設(shè)計(jì)和實(shí)現(xiàn)比較理想化,現(xiàn)在我們要考慮一個(gè)邊界情況,假如網(wǎng)絡(luò)不穩(wěn)定,怎么辦?

  一個(gè)簡單的解決方法就是,當(dāng)網(wǎng)絡(luò)好的時(shí)候把數(shù)據(jù)下載下來,存入 cache 和 storage 中,之后即使網(wǎng)絡(luò)中斷、App 崩潰,我們都能從 storage 中拿到相應(yīng)數(shù)據(jù)。

  這里引入外觀模式(Facade),創(chuàng)建一個(gè)新的 class 名為 LibraryAPI,提供兩個(gè)接口:

  funcgetAlbums(completion : @escaping (_ albums: [Album]?, _ error : NSError?) -> Void)funcgetImage(_ url: String) throws-> UIImage

  這里的方法跟之前 Network 的不同之處在于:getAlbums 方法會先嘗試從 storage 中取出相應(yīng)數(shù)據(jù),如果沒有,則去訪問 Network,之后再把從 Network 中拿到的值存入 storage 中。這里面的實(shí)現(xiàn)有點(diǎn)復(fù)雜,牽涉到兩大模塊和多線程操作,但是我們并不必關(guān)心方法內(nèi)部的實(shí)現(xiàn),而僅僅關(guān)心接口,這就是外觀模式的優(yōu)點(diǎn)。同時(shí),LibraryAPI 這個(gè) class 最好用單例模式(singleton),因?yàn)樗鼞?yīng)該被當(dāng)做是全局 API 被各個(gè) ViewController 來訪問,同時(shí)這樣設(shè)計(jì)也節(jié)省資源。

  優(yōu)化后的 App 流程

  另外一個(gè)優(yōu)化點(diǎn)在于,假如我們一開始拿到很多數(shù)據(jù) —— 例如10000 個(gè)專輯,那么我們該怎么操作?

  正確的做法是分頁。我們可以先只拿20個(gè),顯示在 TableView 上。當(dāng)用戶快滑到底端的時(shí)候,我們可以再取下面20個(gè),然后我們總共有40個(gè)在內(nèi)存中可以顯示,以此類推。這樣做的好處是,我們無需下載所有的數(shù)據(jù),以最快、最流暢的方式布局 TableView,同時(shí)根據(jù)用戶的需求增加相應(yīng)的專輯數(shù)據(jù)。

  最后一個(gè)優(yōu)化點(diǎn)在于,假如用戶上下滑動(dòng)很快,我們?nèi)绾文軌蛴米羁焖俣燃虞d圖片?

  答案是用 operationQueue 來處理,當(dāng)前 cell 是可見的時(shí)候,我們就 resume 下載圖片的進(jìn)程,否則就 suspend。這樣保證了我們用有限的內(nèi)存和 CPU 去最高效的下載用戶需要、當(dāng)前要見的圖片。

  值得一提的是,大家還可以借鑒 ASDK 的思路來進(jìn)一步優(yōu)化程序。

  總結(jié)

音樂小程序開發(fā)名字(音樂小程序研究意義)

  本文從一個(gè)簡單的 tableView App 說起,談?wù)摿碎_發(fā)一個(gè) App 的4個(gè)步驟:需求分析、構(gòu)建架構(gòu)、細(xì)節(jié)實(shí)現(xiàn)、優(yōu)化拓展。簡單介紹了多線程和幾種設(shè)計(jì)模式,希望對大家有所幫助。

免責(zé)聲明:本站文章除注明外均來源于網(wǎng)絡(luò),如有版權(quán)或違規(guī)問題請聯(lián)系我們刪除!
我們猜你喜歡
极品少妇被啪到呻吟喷水| xxxx国产精品| 日韩国产成人精品视频| 国产SM重口调教在线观看| 亚洲AV无码成人精品区明星换面| 久久精品中文字幕第一页| 97国产精华液哪个品牌比较好贵| 日本熟妇色XXXXX日本妇| 国产精品V无码A片在线看| 亚洲成A人片在线观看WWW | 老熟妇一区二区三区啪啪 | 国产极品熟女沙发内射AV| 亚洲AV成人精品网站在线播放| 久久99精品久久久久蜜芽| 中国在线观看免费国语版| 人人妻人人澡人人爽人人蜜臀 | 亚洲妇女行蜜桃AV网网站| 久久亚洲私人国产精品VA| GOGO西西自慰人体高清人体模| 色噜噜狠狠色综合网| 国产亚洲视频在线观看播放| 一本一道波多野结衣AV一区| 妺妺窝人体色WWW看美女| 成年午夜无码AV片在线观看| 学生妹流白浆喷水被草| 久久久久久无码AV成人影院| WWXX在线观看免费| 无码熟妇人妻AV在线影片最多| 精品无码成人网站久久久久久| 777米奇色888狠狠俺去啦| 少妇扒开粉嫩小泬视频| 禁18在线观看免费网站| 97精品人妻系列无码人妻| 手机免费AV片在线观看| 精品人妻伦一二三区久久| 一区二区三区无码被窝影院| 欧美丰满熟妇人妻兽交视频| 成人无码精品1区2区3区免费看| 天天做天天爱天天综合网| 国外亚洲成AV人片在线观看| 野花日本韩国大全免费观看6 | 亚洲精品TY久久久久久久久久 | 国产精品美女久久久M| 亚洲色无码中文字幕手机在线| 老妇人高清在线观看免费版| 成年女人WWXX免费国产| 亚洲成A人片77777kkkk| 欧美成人AⅤ高清免费观看| 国产精品扒开腿做爽爽爽视频| 亚洲熟妇无码AV另类VR影视| 免费视频玩乳吃奶不遮挡网站| 公粗挺进了我的密道在线观看 | GAY国产GV又粗又长又大| 无码人妻一区二区免费AV| 久久综合九色综合欧美| 抖抈APP入口免费| 久久夜色精品国产欧美乱| 99久RE热视频这里只有精品6| 日韩乱码人妻无码系列中文字幕| 国产免费午夜福利蜜芽无码| 尤物AV无码色AV无码| 少妇被 到高潮喷出白浆av| 久久精品国产亚洲无删除| 波多野无码中文字幕AV专区| 亚洲狠狠色丁香婷婷综合| 人妻少妇精品久久久久久| 国内精品久久久久久久97牛牛| 69精产国品一二三产区区别| 无码人妻一区二区三区一| 免费国产成人AⅤ观看| 国产精品JIZZ在线观看老狼| 亚洲中文字幕无码一区无广告| 日韩欧美AⅤ综合网站发布| 久久99久久99精品免视看动漫| 成年女人毛片免费观看中文| 亚洲日韩V无码中文字幕| 欧美人与动牲交免费观看视频| 国精一二二产品无人区免费应用| AV无码精品一区二区三区宅噜噜| 亚洲AV成人无码一区在线观看| 欧美猛片BBBBBⅩXXXX| 国产午夜精品无码理论片| GOGO人体GOGO西西大尺度| 亚洲丰满熟妇在线观看| 日本一卡二卡三卡四卡2021| 久久精品国产亚洲AV忘忧草18| 短篇公交车高H肉辣全集目录| 一边摸一边抽搐一进一出视频| 天堂√中文在线BT| 妺妺窝人体色WWW聚色窝丿| 国产裸拍裸体视频在线观看| BGMBGMBGM老太太XX一| 亚洲加勒比无码一区二区| 日韩加勒比一本无码精品| 久久夜色精品国产亚洲AV动态图 | 在公交上被灌满白浆的视频 | 欧美XXXX做受欧美| 黑料不打烊吃瓜爆料| FREE性满足孕妇VⅠDE0S| 亚洲男人综合久久综合天堂| 人伦片无码中文字| 久久久久亚洲AV片无码下载蜜桃| 国产精品成人AV片免费看| 9L国产精品久久久久麻豆| 亚洲另类无码专区首页| 四虎永久免费地址WW41.6| 女朋友喊疼男生的心理活动知乎| 好男人日本社区WWW| 成人毛片18女人毛片免费| 亚洲欧美日本中文字不卡| 日产精品卡2卡三卡乱码网址| 娇妻在我面前被黑人撑爆| 宝贝儿感受到它对你的爱了吗小说| 亚洲精品有码在线观看| 日韩无人区一卡2卡三卡4卡仙| 久久久噜噜噜久久中文福利| 国产成人无码区免费内射一片色欲 | 国产女主播高潮在线播放| 把佛珠一个一个挤出去| 永久免费的AV在线网无码| 亚洲AV实录无码成人精品电影| 日韩无码视频一区| 女人与公拘交酡过程高清视频| 国产在线精品一区二区在线看| 把腿张开老子臊烂h视频 | 农里粗汉的共妻嗯啊高H| 果冻传媒影视在线播放| 成年性生交大片免费看| 一下子挺进浓密的黑森林| 西方14147大但人文艺术| 色8激情欧美成人久久综合电影 | 国产高清免费AV片在线观看不卡| JAPANESE日本护士XXX| 夜夜高潮夜夜爽高清视频一| 亚洲AV无码久久久久久精品| 丝袜中文人妻无码有码久热| 人妻久久久一区二区三区| 麻豆精品传媒一二三区艾秋| 精东传媒VS天美传媒合作| 国产极品视觉盛宴专区 | 亚洲精品国产AV天美传媒| 我国产码在线观看AV哈哈哈网站 | 我半夜摸妺妺的奶C了她动漫| 日韩人妻无码一区二区三区| 欧美成人精品高清视频| 老师掀起裙子让我挺进| 精品人妻无码中字系列| 国产性夜夜春夜夜爽| 房东天天吃我奶躁我| 99久久免费只有精品国产| 亚洲国产成人无码AV在线播放| 天堂√在线中文资源网| 欧洲一卡二卡三卡| 美女裸身裸乳免费视频的APP | 欧美成人精品视频在线不卡 | 吃奶呻吟打开双腿做受视频免费| 99久久免费国产精品四虎99久久精品免费看国产一区二区 | 又爽又刺激免费男女视频| 亚洲精品天堂无码中文字幕 | 久久久久 亚洲 无码 AV 专| 狠狠色综合久久久久尤物| 国产欧美日韩第一章午夜在线| 国产大陆亚洲精品国产| 多毛丰满日本熟妇| 成人羞羞视频免费网站| 把腿张开老子CAO烂你动态图 | 成人欧美一区二区三区黑人牛| CHINESE中年熟妇FREE| 51VV社区视频在线视频观看| 中文无码字幕中文有码字幕| 亚洲成A人片在线观看无码| 亚洲AⅤ永久无码毛片牛牛影视 | 和老婆一起玩的双人| 国产熟女高潮精品视频区| 国产精品青草久久福利不卡| 国产成人丝袜视频在线观看| 国产成 人 黄 色 网 站 小说| 丰满少妇被猛烈进入高清播放| 成人无码H动漫在线网站樱花| 残忍开嫩苞疼哭了视频| 锕锕锕锕锕锕~好深啊APP| YY8090理论三级在线观看| YY影院电视剧大全| 爱情岛亚洲AV永久入口首页| YOUJIZZ丰满熟妇| 被邻居侵犯性HD中文字幕| 爸的比老公大两倍儿媳叫什么呢 | 久久精品国产男包| 久久久久久精品成人鲁丝电影| 久久精品国产久精国产| 久久久亚洲熟妇熟| 麻豆精品久久久久久中文字幕无码| 久久一区二区三区精华液| 狼人大香伊蕉国产WWW亚洲| 美人电影在线观看| 女色窝人体色777777九色| 欧美男女一进一出| 人妻无码一区二区三区TV| 日本精品少妇一区二区三区| 色婷婷精品久久二区二区蜜臀av|