(IOS)Swift Music 程序分析
本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源App Swift Music的研究心得。




项目地址:https://github.com/xujiyao123/SwiftMusic
一、项目简介
本项目主要实现了歌曲关键字查询歌曲,通过使用
http://h5.kaolafm.com/v3api/api/search?words=\(searchStr)&pageSize=30&pageNum=\(page)&searchType=0&_=1419749689828
http://v3.kaolafm.com/api/play/\(musicId)
这两个API获取歌曲详细信息并进行播放。并通过内置URL访问并播放指定视频内容。
二、项目结构分析

楼主之所以选择分析研究这个项目是因为在学习过程中发现这个项目是一个比较典型的MVC模型,并且所有View部分都是通过代码实现的而非storyboard,具有一定的学习价值。接下来,本文将按照Model、View、Control,三个部分详细分析这个项目是如何通过MVC模型来实现查询歌曲、获取歌曲、播放歌曲及视频功能的。
1、 Model(模型)

在Model部分中,作者一共提供了4个文件。

videos.plist是一个存有所能播放的视频数据的plist文件。

在WebImageCategory.swift中,作者拓展了UIIMageView这个class,加入了一个通过URL获取图片并加载的方法 setWebImageWithUrlStr(urlStr:String?) -> Void。


在MusicModel.swift中,作者定义了两个class,分别是:MusicModel和MusicPlayModel。
MusicModel类是用于建立关键字搜索到的歌曲的对象。其中包含了歌曲的5个属性,并定义了一个类方法loadMusicListDataWithClouse(searchStr:String ,page:Int , clouse:(data:NSMutableArray , haveNext:Int) -> Void) -> Void 通过传入歌曲关键字及搜索页数来获取歌曲的详细信息分别创建MusicModel对象并将其装入一个NSMutableArray中,将所得NSMutableArray传给方法参数clouse以便进行下一步操作。通过引入方法参数clouse(clousure),作者很巧妙的将数据读取并进行封装与对数据之后的操作进行了分离。
MusicPlayModel类则是用于建立通过musicID获取到的歌曲的对象。其中包含了title,pic,mp3Url三个属性,并定义类方法loadMusicDataWithClouse(musicID:String ,clouse:(data:NSMutableArray) -> Void) ->Void 通过传入的musicID,获取歌曲信息并建立MusicPlayModel对象并将去装入NSMutableArray传递给方法参数clouse(clousure)以便进行下一步操作。

在VideoModel.swift中,作者定义了一个VideoModel类,也是运用了痛MusicModel类似的手段对视频信息数据进行处理并传递给clouse。与MusicModel不同的是,在loadVideoDataWithClouse(clouse:(dataArr:NSMutableArray) -> Void) -> Void 中作者通过dispatch_async添加一个异步任务来处理videos.plist里的视频数据。
通过对Model中的4个文件的分析,不难发现,作者在Model部分定义了数据的模型并通过闭包(clousure)的方式接受后续对数据的操作,以达到将Model与其余部分分离的目的。由此可见,使用方法参数(闭包clousure)是一个实现MVC很好的办法。
2、View(视图)
View部分一共包含了2个文件。


在XUTableViewCell.swift文件中作者创建了UITableViewCell并定义了其显示内容及将VideoModel与MusicModel对象填充入Cell的方法。




在MusicPlayerManager.swift中首先定义了协议MusicPlayDelegate,其中包含了4个方法。在MusicPlayManager类中,定义了协议代理delegate,player: AVPlayer! 及var timer:NSTimer!。通过类变量shared获得一个MusicPlayerManager()。方法playWithModel(model:MusicPlayModel) 用于播放音乐并使用timer每隔1s出发playing方法。playing() 方法用于判断播放是否结束,并使用代理调用协议方法playManager(manager:MusicPlayerManager ,BeginToPlayProgress progress:Double) 或 playManagerplayIsEnd(manager:MusicPlayerManager) 并将自身作为参数传递给协议方法。pause() 与 goon() 分别是控制player暂停与播放,并将自身作为参数用代理调用相关协议方法。changeValueWithProgress(value:Float64) ->Void 通过参数的传入来控制player的播放进度。
作者主要在View部分定义了UITableViewCell及MusicPlayerManager并通过使用代理协议的方法,将player本身与其余部分程序进行了分离。在MVC模型中,使用代理来传递值及调用协议方法也是一个很好的办法。
3、 Controller

在Controller中,作者给出了4个文件分别对应了本项目中的4个界面。



RootViewController.swift对应的是项目的主菜单。RootViewController.swift中,设定了页面的背景颜色,定义并实例了UINavigationController()及两个UIButton(),并为两个UIButton定义了触发方法用于跳转页面至按钮分别对应的音乐和电影界面。




RootViewController.swift对应的是视频界面。这之中定义并实例了UITableViewController,通过调用VideoModel.loadVideoDataWithClouse(clouse:(dataArr:NSMutableArray) -> Void) -> Void方法获取视频数据并通过方法drawCellWithModel(model:VideoModel) ->Void将数据载入cell并填充如UITableViewController。同时定义了tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 用于实现播放视频的功能。




MusicListViewController.swift对应着音乐搜索界面,同视频界面相似的定义了UITableViewController并调用cell.drawMusicWithModel(model:MusicModel) ->Void进行填充。与视频界面不同的是,在音乐搜索界面中作者定义并实例了textFild() 用于输入搜索关键字,并定义loadData(page:Int?) ->Void 方法调用MusicModel.loadMusicListDataWithClouse(searchStr:String ,page:Int , clouse:(data:NSMutableArray , haveNext:Int) -> Void) -> Void 获取音乐列表。同时作者还定义了select cell方法用于跳转至音乐播放界面。调用ZLSwifthRefresh 中方法实现列表下拉刷新的功能。





在MusicViewController.swift中作者实例了两个UIButton用于播放和暂停,一个UIImage用于显示歌曲图片并对UIImage进行了圆角和旋转处理(旋转动画+NSTimer触发器),一个UISlider()用于显示及控制播放进度。通过使用MusicPlayModel.loadMusicDataWithClouse(musicID:String ,clouse:(data:NSMutableArray) -> Void) ->Void 方法获取播放歌曲的数据及信息。使用MusicPlayerManager.shared属性获得MusicPlayerManager(),调用MusicPlayerManager()中的方法达到控制播放器播放暂停的效果,并获得协议代理,同时实现代理中的4个方法。
作者在Controller的4个文件中分别将4个页面中所包含的各个控制器进行了定义及实例。通过不同的指令调用Model中的方法获得数据,并将数据传递给View中的Cell和Player进行显示及播放。
三、项目音乐部分运行流程图

四、项目可改进部分
1、项目在URL通信部分中还在使用NSURLConnection而并未使用功能更加完善的NSURLSession。
2、项目UI及功能较为简单。
3、虽然定义了MusicPlayerDelegate协议,但在实际实现过程中并未赋予其实用功能。View与Controller间交互也是通过传递MusicPlayerManager()来完成的。
五、总结
本项目虽然在功能上较为简单,但是在程序设计的结构上很好的遵循MVC模型,并通过clousure,代理协议,对象传递等方式来达成Model、View和Controller三者之间的交互。这是值得学习的。作者完全使用代码对界面进行设计,也是值得借鉴的,毕竟有的时候用代码设计界面比storyboard会来的更为方便。
(IOS)Swift Music 程序分析的更多相关文章
- (IOS)BaiduFM 程序分析
本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源app BaiduFM的研究心得. 项目地址:https://github.com/belm/BaiduFM-Swift 一.项 ...
- iOS swift项目IM实现,从长连接到数据流解析分析之Socket
iOS swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介: 去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了: ...
- 33 个 2017 年必须了解的 iOS/swift 开源库第三方库
本文翻译自Medium,原作者为 Paweł Białecki<img src="https://pic3.zhimg.com/v2-c786777447261347b0d97 ...
- iOS swift的xcworkspace多项目管理(架构思想)
iOS swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...
- iOS Swift WisdomScanKit图片浏览器功能SDK
iOS Swift WisdomScanKit图片浏览器功能SDK使用 一:简介 WisdomScanKit 由 Swift4.2版编写,完全兼容OC项目调用. WisdomScanKit的 ...
- iOS Swift WisdomScanKit二维码扫码SDK,自定义全屏拍照SDK,系统相册图片浏览,编辑SDK
iOS Swift WisdomScanKit 是一款强大的集二维码扫码,自定义全屏拍照,系统相册图片编辑多选和系统相册图片浏览功能于一身的 Framework SDK [1]前言: 今天给大家 ...
- iOS Swift WisdomKeyboardKing 键盘智能管家SDK
iOS Swift WisdomKeyboardKing 键盘智能管家SDK [1]前言: 今天给大家推荐个好用的开源框架:WisdomKeyboardKing,方面iOS日常开发,优点和功能请 ...
- 《iOS应用逆向工程:分析与实战》
<iOS应用逆向工程:分析与实战> 基本信息 作者: 沙梓社 吴航 刘瑾 丛书名: 信息安全技术丛书 出版社:机械工业出版社 ISBN:9787111450726 上架时间:2 ...
- iOS开发人员程序许可协议
请细致阅读以下的许可协议条款和条件之前下载或使用苹果软件. 这些条款和条件构成你和苹果之间的法律协议. iOS开发人员程序许可协议 目的 你想使用苹果软件(例如以下定义)来开发一个或多个应 ...
随机推荐
- SQL Server:分离和重新附加数据库
对于分离一个数据库来说,我们可以用Manage Studio界面或者存储过程.但是对于每一种方法都必须保证没有用户使用这个数据库.接下来所讲的都是对于用命令来分离或附加一个数据库.对于用Manage ...
- ServletContext图解
servlet之间共享数据资源!
- Android广播机制概述
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- iOS @try
try{ //1:抛出异常的代码 //2:代码 }catch(){ //3:代码 //4:抛出异常 }finally{ //5:代码 } //6:代码要明确的一点是:不管try是否抛出异常,final ...
- HDU4276 The Ghost Blows Light(树形DP+背包)
题目大概说一棵n个结点树,每个结点都有宝藏,走过每条边要花一定的时间,现在要在t时间内从结点1出发走到结点n,问能获得最多的宝藏是多少. 放了几天的题,今天拿出来集中精力去想,还是想出来了. 首先,树 ...
- Android view 的事件分发机制
1 事件的传递顺序是 Activity -> Window -> 顶层View touch 事件产生后,最先由 activity 的 dispatchTouchEvent 处理 /** * ...
- ural 1306. Sequence Median
1306. Sequence Median Time limit: 1.0 secondMemory limit: 1 MBLanguage limit: C, C++, Pascal Given a ...
- BZOJ4294 : [PA2015]Fibonacci
斐波那契数列模$10^m$的循环节为$6\times10^m$,于是从低位到高位dfs即可. #include<cstdio> #include<cstring> #defin ...
- Centos6.4 yum安装MariaDB5.5
vi /etc/yum.repos.d/MariaDB.repo 加入下面内容 [mariabd]name=MariaDBbaseurl=http://yum.mariadb.org/5.5.34/c ...
- html ul 里 能放其他标签吗,比如h3、p?
按标准的话,ul 里面应该只能放li,不过看见同事有的放了h3.p这些,这样到底可不可以? <ul>里面只能放<li>.但是<li>里面可以放<h*> ...