这几天在做音乐播放器,需要做下载缓存,所以把下载这个模块单独整理出来,希望对大家有所帮助,前面提到过,swift其实跟OC的语法大同小异,下载也差不多,这里我使用的就是使用代理下载的,跟OC的方法步骤大致相同
、、、
var session:NSURLSession?
//这里我声明成单例,便于全局的调用,并且初始化session对象,给session遵循代理
static var shareMusicDownload:MusicDownload = {
let instance = MusicDownload()
instance.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: instance, delegateQueue:NSOperationQueue.mainQueue())
return instance
}()
//
func creatDownLoadTask(platmodel:PlayModel){
let downloadTask = session?.downloadTaskWithURL(NSURL(string: platmodel.file_link!)!)
downloadTask?.resume()
}
设置代理以后就需要实现代理的三个方法
//下载成功时调用,下载后默认文件夹是沙盒的tmp文件夹,如果不移到指定文件夹,系统会很快删除掉
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL){
let cachepath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0]
//拼接一个存放的路径 suggestedFilename是该文件在服务器里面的文件名,建议客户端和的文件名跟服务器的一样
let filePath = cachepath.stringByAppendingString("/\(downloadTask.response!.suggestedFilename!).mp3")
print(filePath)
let fileManager = NSFileManager.defaultManager()
do{
try fileManager.moveItemAtPath((location.path)!, toPath: filePath)
}catch{
print("文件夹移动失败,或者已经存在")
}
}
//正在下载,写入的时候会重复调用
/**
- parameter bytesWritten: 此次请求到的数据大小
- parameter totalBytesWritten: 已经写入沙盒的文件大小
- parameter totalBytesExpectedToWrite: 要下载的文件的大小
*/
func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64){
print("下载进度-----\((Float(totalBytesWritten)) / Float(totalBytesExpectedToWrite))")
}
//这里我用storyboard拖了一个button,在点击方法里实现暂停开始下载
、、、
@IBAction func downloadBtnAction(sender: AnyObject) {
if downloadTask == nil {
if resumeData != nil {
//继续操作
downloadTask = session.downloadTaskWithResumeData(resumeData!)
downloadTask?.resume()
resumeData = nil
}else{
//刚开始启动的操作
//如果想要通过协议来监听整个下载操作的话,task创建的时候不能带有block方法,使用带有block回调的创建方式默认会优先调用block
downloadTask = session.downloadTaskWithURL(NSURL(string: urlString)!)
downloadTask?.resume()
}
}else{
//停止操作
pause()
}
}
、、、