国产河南妇女毛片精品久久久_深夜福利久久_色婷婷综合久久久久_亚洲高清在线播放

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

副標題
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ā)中,寫一個 App 很容易,但是要寫好一個 App,確是要下另一番功夫。首先,我們來看一個 App 的開發(fā)要求:

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

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

需求分析

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

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

  LadyGaga

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

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

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

Model 部分:

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

View 部分:

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

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

ViewController 部分:

  其中一個 ViewController 為 TableViewController,負責現(xiàn)實所有專輯的信息;

  另一個 ViewController 負責展示 detail info,比如專輯的大圖;

Network 部分:

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

  基本架構(gòu)

  細節(jié)實現(xiàn)

Network 部分:

  fetchAlbums 和 downloadImage 都用Apple 自帶的 URLSession 和 JSONserialization 就可以實現(xiàn),或者也可以用優(yōu)秀的第三方庫 AlamoFire。因為這個 App 比較簡單,AlamoFire 優(yōu)勢不明顯,且引入第三方庫會增加 App 的體積,故而推薦使用前者。基本上就是實現(xiàn)下面兩個函數(shù):

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

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

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

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

  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 上。我們只要實現(xiàn)相應(yīng)的 dataSource 和 delegate 方法即可。其中對于 dataSource 而言,有兩個方法是必須實現(xiàn)的,它們是:

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

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

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

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

View 部分:

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

  App 運行流程

  優(yōu)化拓展

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

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

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

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

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

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

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

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

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

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

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

  總結(jié)

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

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

免責聲明:本站文章除注明外均來源于網(wǎng)絡(luò),如有版權(quán)或違規(guī)問題請聯(lián)系我們刪除!
我們猜你喜歡
国产河南妇女毛片精品久久久_深夜福利久久_色婷婷综合久久久久_亚洲高清在线播放
亚洲日韩第九十九页| 欧美黄在线观看| 国产精品99久久久久久白浆小说 | 韩日精品视频一区| 影音先锋亚洲精品| 日韩亚洲欧美一区| 午夜精品在线观看| 久久亚洲影院| 欧美日韩国产综合视频在线| 国产精品女主播| 韩国av一区二区三区在线观看| 亚洲欧洲偷拍精品| 亚洲综合色自拍一区| 久久人人97超碰国产公开结果| 欧美激情一区二区三区| 国产精品综合视频| 亚洲激情在线| 午夜精品999| 美腿丝袜亚洲色图| 国产精品综合av一区二区国产馆| 亚洲第一精品夜夜躁人人躁| 一区二区三区精品视频在线观看| 欧美一区二区精品久久911| 欧美成人资源网| 国产日韩1区| 亚洲久久一区| 久久久久国产一区二区三区四区| 欧美.日韩.国产.一区.二区| 欧美日韩三级一区二区| 国产九区一区在线| 亚洲国产99精品国自产| 亚洲免费观看视频| 欧美在线观看一二区| 老色鬼久久亚洲一区二区| 欧美日韩视频一区二区三区| 国产偷国产偷精品高清尤物| 亚洲黄色成人| 亚洲欧美日本国产专区一区| 久久一区亚洲| 国产精品国产a级| 伊人久久大香线蕉av超碰演员| 99在线|亚洲一区二区| 久久国产加勒比精品无码| 欧美激情亚洲| 国产精品一区二区你懂的| 亚洲第一精品久久忘忧草社区| 亚洲一卡久久| 噜噜噜噜噜久久久久久91| 国产精品久久777777毛茸茸| 影音先锋亚洲精品| 亚洲欧美国产制服动漫| 蜜桃精品久久久久久久免费影院| 国产精品jvid在线观看蜜臀 | 亚洲国产美女久久久久 | 浪潮色综合久久天堂| 国产酒店精品激情| 亚洲网友自拍| 欧美日本中文字幕| 亚洲国产欧美一区二区三区久久| 久久成年人视频| 国产精品久久久久永久免费观看 | 国产精品久久久久久一区二区三区 | 黄色国产精品一区二区三区| 亚洲欧美日韩中文在线制服| 欧美视频在线观看| 欧美色一级片| 麻豆国产精品一区二区三区| 裸体丰满少妇做受久久99精品| 国产午夜精品久久久| 亚洲欧美乱综合| 欧美性猛交99久久久久99按摩 | 欧美三日本三级少妇三2023| 亚洲人成人99网站| 欧美成人精品h版在线观看| 在线观看亚洲a| 久久亚洲不卡| 精品成人一区二区| 久久中文字幕一区| 激情久久久久久久| 一本色道久久综合亚洲精品小说 | 亚洲欧美精品在线观看| 欧美性猛交视频| 亚洲无线一线二线三线区别av| 欧美三日本三级三级在线播放| 一本综合精品| 国产精品h在线观看| 亚洲欧美激情精品一区二区| 国产精品av免费在线观看| 亚洲神马久久| 国产精品免费看| 性欧美18~19sex高清播放| 国产视频久久久久| 久久久久久综合| 1204国产成人精品视频| 欧美大片一区| 日韩亚洲欧美精品| 国产精品国产三级国产专区53| 亚洲专区免费| 国产日韩在线亚洲字幕中文| 久久久蜜臀国产一区二区| 亚洲大胆av| 欧美片第一页| 亚洲男人第一av网站| 国产亚洲精品久久久| 久久综合久久综合这里只有精品| 亚洲激情第一区| 欧美视频一区二区三区…| 午夜精品国产更新| 黄色精品免费| 欧美精品在线看| 亚洲香蕉视频| 国产一区二区三区黄视频| 乱中年女人伦av一区二区| 日韩午夜在线观看视频| 国产精品视频导航| 久久美女性网| 亚洲伦伦在线| 国产精品尤物福利片在线观看| 久久久久久伊人| 亚洲精品一区二区三区av| 国产精品激情电影| 久久久夜精品| 日韩一二三区视频| 国产日韩欧美高清免费| 免费欧美网站| 亚洲视频免费在线| 狠狠色伊人亚洲综合网站色| 欧美激情四色 | 夜夜夜久久久| 国产私拍一区| 欧美精品www| 欧美一区二区高清| 亚洲人成人一区二区三区| 国产精品美女久久久久久免费| 久久乐国产精品| 亚洲一区二区三区涩| 伊人久久大香线蕉综合热线| 欧美日韩三级电影在线| 久久久久九九九| 中日韩视频在线观看| 激情久久一区| 国内精品嫩模av私拍在线观看| 国产亚洲成av人片在线观看桃| 欧美黄网免费在线观看| 新67194成人永久网站| 亚洲一区二区三区四区五区午夜| 美国成人直播| 亚洲图色在线| 亚洲成人在线观看视频| 国产精品qvod| 老鸭窝毛片一区二区三区| 亚洲一区日本| 亚洲片在线资源| 国产在线视频欧美| 欧美日韩中文在线观看| 久久天堂精品| 午夜视频在线观看一区| 亚洲精品裸体| 韩日在线一区| 国产精品爽黄69| 欧美日本在线一区| 久久五月天婷婷| 午夜天堂精品久久久久| 亚洲美女尤物影院| 激情综合网激情| 国产精品无码永久免费888| 欧美激情第9页| 久久婷婷国产麻豆91天堂| 午夜精品剧场| 亚洲视频精选在线| 亚洲日本中文字幕免费在线不卡| 好看的日韩av电影| 国产伦精品一区二区三区四区免费 | 久久国产88| 91久久久久久久久久久久久| 国产精品高清免费在线观看| 国产精品女主播一区二区三区| 欧美mv日韩mv国产网站| 欧美专区亚洲专区| 亚洲影院免费| 9人人澡人人爽人人精品| 亚洲大胆人体在线| 国模私拍一区二区三区| 国产精品网站在线播放| 国产精品分类| 欧美日韩视频在线第一区| 欧美—级在线免费片| 麻豆成人在线播放| 久久免费视频观看| 久久久久99| 久久精品99久久香蕉国产色戒| 篠田优中文在线播放第一区| 亚洲一区二区在线观看视频| 日韩亚洲欧美在线观看| 亚洲精品欧美精品| 亚洲人成在线免费观看| 91久久精品国产91性色| 亚洲国内精品在线| 亚洲国产日韩欧美在线99| 亚洲国产成人av| 亚洲黄色性网站| 亚洲电影一级黄| 亚洲韩国青草视频| 国产精品久久久久99|