Swift版下载

这几天在做音乐播放器,需要做下载缓存,所以把下载这个模块单独整理出来,希望对大家有所帮助,前面提到过,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()
}
}
、、、

你可能感兴趣的:(Swift版下载)