(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会来的更为方便。

时间: 2024-10-14 02:15:11

(IOS)Swift Music 程序分析的相关文章

(IOS)BaiduFM 程序分析

本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源app BaiduFM的研究心得. 项目地址:https://github.com/belm/BaiduFM-Swift 一.项目简介 项目通过使用百度音乐的API实现了播放.下载与收藏音乐的FM基本功能.同时实现了歌词滚动,显示实时进度条,支持后台播放,锁屏显示歌曲信息及控制播放等附加功能并添加了对Apple Watch的支持.此APP可谓是功能十分强劲,下面楼主就来好好分析下这款APP的代码及功能实现原理. 二.APP

李洪强iOS开发之典型C语言程序分析

典型的C程序分析 实际开发中,常常是多个文件进行开发的,将不同内容分到不同的文件中, 在同一个文件里,编写同种类型的代码,有时,代码功能比较复杂的时候, 还可以做文件夹的分类,将某类具体的功能,创建成一个文件夹,而这个 具体的功能需要很多代码来实现,可以在这个文件夹中,分成许多代码文件 实际开发时,代码单独的成一组文件,一般是.c文件和.h文件 一般使用.c作为文件名,头文件使用.h作为文件名,可以将代码编译成 一个目标文件,同头文件一起发布,(SDK) SDK: 开发工具包 (把功能函数,语法

33 个 2017 年必须了解的 iOS/swift 开源库第三方库

本文翻译自Medium,原作者为 Pawe? Bia?ecki 照片版权:(Unsplash/Markus Pe) 你好,iOS 开发者们!我的名字叫 Pawe?,我是一个独立 iOS 开发者,并且是 Enter Universe 的作者. 接近两年前我发布了 27 个iOS开源库,让你的开发坐上火箭吧.这是我在这里最棒的文章了(根据 Medium 用户的反馈来看): 如果有 15.5 万人 很担心能否跨越网络上连山排海般的文字找到最棒的 iOS 开源库,那我来传递. 跟 33 个 pod 打个

ios Swift 之github

1. 软件类 a) 作者集合 http://nondot.org/sabre/ b) swift for facebook SWIFT是一个易于使用的,基于注解的Java来创建勤俭节约序列化类型和服务库. https://github.com/facebook/swift 2. 游戏类 a)FlappySwift https://github.com/fullstackio/FlappySwift b) 2048 https://github.com/austinzheng/swift-2048

iOS获取.ipa程序包

iOS获取.ipa程序包 原文在此 首先肯定不是获取自己的ipa包. 为什么要获取ipa包呢?比如,在仿写一些程序时,避免不了获取它的图片素材等等,那么最快也是最有效的方式就是获取原程序的ipa包.更或者,你想要逆向分析某一款APP时,那么只有获取了ipa后才能进行class-dump,ida等等后续工作. 一.通过越狱设备 如果有越狱手机,那么就变得很简单,只需要从AppStore下载到越狱手机,然后用iTools/PP助手等工具将ipa包备份到电脑即可,下图是使用PP助手: 如果只是为了获取

对苹果“五仁”编程语言Swift的简单分析

对苹果"五仁"编程语言Swift的简单分析 苹果在昨天的WWDC上,发布了新的编程语言Swift.这两天开发社区都在讨论这个语言,从语言的特性上大家发现了好多语言的影子,这样的情况可以说是集大成,也可以说是"五仁".每个人看问题的角度都不同,下面从个人的角度来看看这门语言涉及到的工具链及其对越狱开发的影响. 由于刚刚发布,针对相关工具的介绍几乎没有,那我们就从xcode中寻找.在shell中执行: find /Applications/Xcode6-Beta.app

iOS symbolicatecrash崩溃日志分析

1.保留发布程序的 .app文件 和 .dSYM文件 连同.crash文件放在同一个文件家里面. 2.在/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library /PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources 或者/Applications/Xcode.app/Contents/Develope

ios Swift ! and ?

swift ?和!之间区别: Swift 引入的最不一样的可能就是 Optional Value 了.在声明时,我们可以通过在类型后面加一个? 来将变量声明为 Optional 的.如果不是 Optional 的变量,那么它就必须有值.而如果没有值的话,我们使用 Optional 并且将它设置为 nil 来表示没有值. //num 不是一个 Int var num: Int? //num 没有值 num = nil //nil //num 有值 num = 3 //{Some 3} Apple

必应词典手机版(IOS版)与有道词典(IOS版)之软件分析【功能篇】

1.序言: 随着手机功能的不断更新和推广,手机应用市场的竞争变得愈发激烈.这次我们选择必应词典和有道词典的苹果客户端作对比,进一步分析这两款词典的客户端在功能和用户体验方面的利弊.这次测评的主要评测人是团队PM,另有其他同学给出建议. 2.软件分析与测评: 我们选择的是必应词典(version3.2.2 for ios)和有道词典(version 5.1.2 for ios) 2.1核心功能: 2.1.1词典功能: 众所周知词典的基本功能就是查词,在查词的基础上会给出相应的英文解释,例句以及用法