看了很多帖子講述 NSURLSession,沒有一個講得很清楚,自己琢磨測試,封了下一個類,測試可用,直接上碼!學習勿噴。
import Foundation
import UIkit
let BOUNDARY = "----------V2ymHFg03ehbqgZCaKO6jy" //標識符
var downloadList:NSMutableArray! = NSMutableArray()
var uploadList:NSMutableArray! = NSMutableArray()
class Download{
var downSession:NSURLSession!
var downRequest:NSURLRequest!
var downTask:NSURLSessionDownloadTask!
var saveName:String!
var isDowning:Bool!
var callBack: ((NSURL!, NSURLResponse!, NSError!) -> Void)!
var progressFunc:((Float!)->Void)!
}
class Upload{
var upSession:NSURLSession!
var upRequest:NSMutableURLRequest!
var upTask:NSURLSessionUploadTask!
var callBack:((NSData!, NSURLResponse!, NSError!) -> Void)!
var progressFunc:((Float!)->Void)!
}
class HttpData{
var httpDataSession:NSURLSession!
var httpDataRequest:NSMutableURLRequest!
var httpDataTask:NSURLSessionDataTask!
var callBack:((NSData!, NSURLResponse!, NSError!) -> Void)!
}
class VKHttpManager:NSObject,NSURLSessionDelegate{
class var manager:VKHttpManager{
return VKHttpManager()
}
class func initDown(URL downUrl:String!,saveName:String!,progressFunc:((Float!)->Void)!,backFunc: ((NSURL!, NSURLResponse!, NSError!) -> Void)!)->Download{
var down:Download = Download()
down.downSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),delegate:manager,delegateQueue:nil)
down.downRequest = NSURLRequest(URL: NSURL(string:downUrl))
downloadList.addObject(down)
down.downTask = down.downSession.downloadTaskWithRequest(down.downRequest,completionHandler:backFunc)
down.callBack = backFunc
down.saveName = saveName
down.progressFunc = progressFunc
return down
}
class func startDownload(down:Download!){
down.isDowning = true
down.downTask.resume()
}
class func cancleDownload(down:Download!){
down.isDowning = false
down.downTask.cancel()
}
class func initUp(upUrl:String!,fileParam:String!,filePath:String!,keyArry:NSArray!,valueArry:NSArray!,progressFunc:((Float!)->Void)!,backFuc:((NSData!, NSURLResponse!, NSError!) -> Void)!)->Upload{
var up = Upload()
up.upSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),delegate:manager,delegateQueue:NSOperationQueue.mainQueue())
up.upRequest = NSMutableURLRequest(URL: NSURL(string:upUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)))
up.upRequest.HTTPMethod = "POST"
var contentType = "multipart/form-data; boundary="+BOUNDARY
up.upRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")
var body = NSMutableData.data()
var fileData = NSData(contentsOfFile:filePath)
if keyArry != nil && valueArry != nil && valueArry.count > 0 && keyArry.count > 0{
for var i=0; i < keyArry.count; ++i{
body.appendData(String("--"+BOUNDARY+"\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))
body.appendData(String("Content-Disposition: form-data; name=\""+String(keyArry.objectAtIndex(i) as String)+"\"\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))
body.appendData((String(valueArry.objectAtIndex(i) as String)+"\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))
}
}
if fileData != nil {
body.appendData(String("--"+BOUNDARY+"\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))
body.appendData(String("Content-Disposition: form-data; name=\""+fileParam+"\"; filename=\""+filePath.lastPathComponent+"\"\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))
body.appendData(String("Content-Type: application/zip\r\n\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))
body.appendData(fileData)
body.appendData(String("\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true))
}
body.appendData(String("--"+BOUNDARY+"--\r\n").dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true));
up.upTask = up.upSession.uploadTaskWithRequest(up.upRequest, fromData:body,completionHandler:backFuc)
up.progressFunc = progressFunc
up.callBack = backFuc
uploadList.addObject(up)
return up
}
class func startUpload(var up:Upload!){
up.upTask.resume()
}
class func cancleUpload(var up:Upload!){
up.upTask.cancel()
}
class func initHttpData(httpDataUrl:String!,keyArry:NSArray!,valueArry:NSArray!,backFuc:((NSData!, NSURLResponse!, NSError!) -> Void)!)->HttpData{
var httpData = HttpData()
httpData.httpDataSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),delegate:manager,delegateQueue:nil)
httpData.httpDataRequest = NSMutableURLRequest(URL: NSURL(string:httpDataUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)))
httpData.httpDataRequest.HTTPMethod = "POST"
var params:String=""
if keyArry != nil && valueArry != nil && valueArry.count > 0 && keyArry.count > 0{
for var i=0; i < keyArry.count; ++i{
if i == 0 {
params = String(keyArry.objectAtIndex(i) as String)+"="+String(valueArry.objectAtIndex(i) as String)
}else {
params = params+"&"+String(keyArry.objectAtIndex(i) as String)+"="+String(valueArry.objectAtIndex(i) as String)
}
}
}
httpData.httpDataRequest.HTTPBody = params.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
httpData.httpDataTask = httpData.httpDataSession.dataTaskWithRequest(httpData.httpDataRequest,completionHandler:backFuc)
httpData.callBack = backFuc
return httpData
}
class func startHttpData(var httpData:HttpData){
httpData.httpDataTask.resume()
}
class func cancleHttpData(var httpData:HttpData){
httpData.httpDataTask.cancel()
}
// 回調 反饋
func URLSession(session: NSURLSession!, downloadTask: NSURLSessionDownloadTask!, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64){
var progress = Float(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite));
for var i=0; i<downloadList.count; ++i{
var d = downloadList[i] as Download
d.progressFunc(progress)
}
}
func URLSession(session: NSURLSession!, downloadTask: NSURLSessionDownloadTask!, didFinishDownloadingToURL location: NSURL!){
println("Finish") // 下載完成
var defaultFileMag:NSFileManager! = NSFileManager.defaultManager()
for var i = 0 ; i<downloadList.count; ++i{
var d = downloadList[i] as Download
if d.downSession == session {
var destinationPath = NSURL(fileURLWithPath:String(FileOp.getDocumentPath()+"/"+d.saveName))
defaultFileMag.removeItemAtURL(destinationPath,error:nil);
var copyFile:Bool = defaultFileMag.copyItemAtURL(location,toURL:destinationPath,error:nil)
if copyFile == false {
println("copyItemAtURL error")
return
}
downloadList.removeObjectAtIndex(i)
}
}
}
func URLSession(session: NSURLSession!, task: NSURLSessionTask!, didCompleteWithError error: NSError!){
for var i = 0 ; i<downloadList.count; ++i{
var d = downloadList[i] as Download
if d.downSession == session {
downloadList.removeObjectAtIndex(i)
}
}
for var i = 0 ; i<uploadList.count; ++i{
var d = uploadList[i] as Upload
if d.upSession == session {
uploadList.removeObjectAtIndex(i)
}
}
println("alwaysFinish") // 不管下載錯誤和正確
println(error)
}
func URLSession(session: NSURLSession!, task: NSURLSessionTask!, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64){
var progress = Float(Float(totalBytesSent)/Float(totalBytesExpectedToSend));
for var i=0; i<uploadList.count; ++i{
var u = uploadList[i] as Upload
u.progressFunc(progress)
}
}
}
這裏補充下調用方法,可能有些初學者看的不是很懂
var up = VKHttpManager.initUp("http://192.168.1.107/myphp/index/upload/",fileParam:"file",filePath:NSBundle.mainBundle().pathForResource("11", ofType: "mp3"),keyArry:nil,valueArry:nil,progressFunc:prog,backFuc:{
data,response,error in
println(NSString(data: data,encoding:NSUTF8StringEncoding))
})
VKHttpManager.startUpload(up)
func prog(p:Float!)->Void{
println(p)
}
var down = VKHttpManager.initDown(URL:"http://192.168.1.107/myphp/2222.mp3",saveName:"12.jpg",progressFunc:prog,backFunc:nil)
VKHttpManager.startDownload(down)